2013-02-10 93 views
9

我有我想排追加到彼此,即merge(..., all=T)data.frame对象的列表。但是,merge似乎删除了我需要保持不变的行名称。有任何想法吗?例如:rbind 2个data.frame保留行顺序和行名称

x = data.frame(a=1:2, b=2:3, c=3:4, d=4:5, row.names=c("row_1", "another_row1")) 
y = data.frame(a=c(10,20), b=c(20,30), c=c(30,40), row.names=c("row_2", "another_row2")) 
> merge(x, y, all=T, sort=F) 
    a b c d 
    1 1 2 3 4 
    2 2 3 4 5 
    3 10 20 30 NA 
    4 20 30 40 NA 
+0

可能是 z < - merge(x,y,all = T,sort = F); rownames(Z)< - C(rownames(X),rownames(Y)) – 2013-02-10 15:55:43

+3

如果我理解你的权利,你要列数也不同在一起'rbind'数据帧。 [这个问题](http://stackoverflow.com/questions/3402371/rbind-different-number-of-columns)可能对您有所帮助,尤其是'从'plyr'包rbind.fill'。 – 2013-02-10 15:56:58

+0

@阿伦[Ananda Mahto的回答](http://stackoverflow.com/a/14799551/697568)照顾。 – 2013-02-10 17:11:32

回答

14

既然你知道你实际上并没有合并,而只是rbind-ING,也许这样的事情会工作。它使用“plyr”中的rbind.fill。要使用它,请指定的list,您要rbind

RBIND <- function(datalist) { 
    require(plyr) 
    temp <- rbind.fill(datalist) 
    rownames(temp) <- unlist(lapply(datalist, row.names)) 
    temp 
} 
RBIND(list(x, y)) 
#    a b c d 
# row_1   1 2 3 4 
# another_row1 2 3 4 5 
# row_2  10 20 30 NA 
# another_row2 20 30 40 NA 
11

一种方法是在合并中使用row.names,以便将其作为附加列。

> merge(x, y, by=c("row.names", "a","b","c"), all.x=T, all.y=T, sort=F) 

#  Row.names a b c d 
# 1  row_1 1 2 3 4 
# 2 another_row1 2 3 4 5 
# 3  row_2 10 20 30 NA 
# 4 another_row2 20 30 40 NA 

编辑:通过与getS3method('merge', 'data.frame')merge功能,row.names明确设置为NULL(这是一个相当长的代码,所以我不会在这里贴)。

# Commenting 
# Lines 63 and 64 
row.names(x) <- NULL 
row.names(y) <- NULL 

# and 
# Line 141 (thanks Ananda for pointing out) 
attr(res, "row.names") <- .set_row_names(nrow(res)) 

,并创建一个新的功能,比如说,MERGE,作品的OP打算在这个例子。只是一个实验。

+0

+1。我总是忘了能够对' “row.names”' – A5C1D2H2I1M1N2O1R2T1 2013-02-10 16:00:14

+0

关于你的编辑合并,我也不得不删除线141('ATTR(RES “row.names”<) - .set_row_names(nrow(RES)) ')。我已经提出了一个要点(https://gist.github.com/mrdwab/4750113),可以使用库(devtools)加载和运行; source_gist(4750113); MERGE(x,y,all = TRUE)',至少部分验证了你的实验。 – A5C1D2H2I1M1N2O1R2T1 2013-02-10 16:53:25

+0

让我们想象你有第三个DF,'ž< - data.frame(A = C(11,21),B = C(22,32),d = C(33,43),row.names = C( “row_3”,“another_row3”))'。我们如何才能定期使用“merge”工作(或许可以使用'Reduce',或者甚至手动)? 'MERGE'按预期的方式工作,使用'Reduce(函数(x,y)MERGE(x,y,all = TRUE,sort = FALSE),list(x,y,z))'(或多或少 - 列顺序改变)和'RBIND(list(x,y,z))'也有诀窍。但是我不能在这里弄清楚一个没有掺杂的基础'合并'解决方案。有任何想法吗? – A5C1D2H2I1M1N2O1R2T1 2013-02-10 18:44:39