2013-05-07 32 views
6

有谁知道如何在rbind.fill函数中保留rownames。在R中使用rbind.fill时保留行名称

library(plyr) 

#creating data 
a <- mtcars[ 1:5 , c("mpg","hp","gear") ] 
b <- mtcars[ 6:10 , c("mpg","disp","gear") ] 

#does not work because there are different colnames 
rbind(a,b) 

#works but eliminates the rownames 
bound <- rbind.fill(a , b) 

我正在设置一个循环,其中将使用rbind.fill连接对象。现在我正在使用这样的组合功能:

namess <- c(rownames(a) , rownames(b)) 
rownames(bound) <- namess 

我认为可能有更好的方法。谢谢!

+0

我会认为这是一个错误。我不知道'plyr'是否有bug报告论坛/地点,但是如果有人应该链接到它,并且应该提交这个文件。 – eddi 2013-05-07 15:19:43

+1

@eddi同意:)我刚刚在github上提交了它https://github.com/hadley/plyr/issues/156 – 2013-05-07 15:21:34

+1

Plyr不支持行名称。把它们放在一个变量中,然后明确地处理它们是一个更好的主意。 – hadley 2013-05-07 15:29:24

回答

0

自从五年前我发布这个问题以来,一个新的功能变得可用。 smartbind解决了这个问题。

library(gtools) 

#creating data 
a <- mtcars[ 1:5 , c("mpg","hp","gear") ] 
b <- mtcars[ 6:10 , c("mpg","disp","gear") ] 

smartbind(a , b) 
2

你可以尝试申请执行rbind.fill,并自动设置初始rownames像这样的自定义函数:

# List of sample data 
ab.list <- list(a <- mtcars[1:5 , c("mpg","hp","gear")], 
       b <- mtcars[6:10 , c("mpg","disp","gear")]) 

# Apply custom function (rbind and rownames adjustment) to sample data 
do.call(function(...) { 

    tmp <- plyr::rbind.fill(...) 
    rownames(tmp) <- sapply(ab.list, function(i) { 
    rownames(i) 
    }) 

    return(tmp) 

}, ab.list) 

        mpg hp gear disp 
Mazda RX4   21.0 110 4 NA 
Mazda RX4 Wag  21.0 110 4 NA 
Datsun 710  22.8 93 4 NA 
Hornet 4 Drive 21.4 110 3 NA 
Hornet Sportabout 18.7 175 3 NA 
Valiant   18.1 NA 3 225.0 
Duster 360  14.3 NA 3 360.0 
Merc 240D   24.4 NA 4 146.7 
Merc 230   22.8 NA 4 140.8 
Merc 280   19.2 NA 4 167.6 

退房this previous post,与类似的问题涉及。

+1

通过解析'...'中的参数来首先从函数中提取行名称,而不是回到他们的父框架中可能更好。 – joran 2013-05-07 15:18:44

+0

@joran,随意编辑:-) – fdetsch 2013-05-07 15:20:47

+0

我实际上遇到了一个很好的方法来处理通过'ab.list' _and_'ab.list [[1]],ab.list [ [2]]'分开。 – joran 2013-05-07 15:35:16