2011-10-12 88 views
36

如何合并两个数据帧的列,其中包含一组不同的列,但是某些行的名称相同?没有在这两个数据帧发生的行中的字段应该用零填充:根据Rownames中的合并数据帧R

> d 
    a b c d e f g h i j 
1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10 
2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 
> e 
    k l m n o p q r s t 
1 11 12 13 14 15 16 17 18 19 20 
3 21 22 23 24 25 26 27 28 29 30 
> de 
    a b c d e f g h i j k l m n o p q r s t 
1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10 11 12 13 14 15 16 17 18 19 20 
2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0 0 0 0 0 0 0 0 0 
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 21 22 23 24 25 26 27 28 29 30 

回答

61

?merge

名称“row.names”或数字0指定行名称。

例子:

R> de <- merge(d, e, by=0, all=TRUE) # merge by row names (by=0 or by="row.names") 
R> de[is.na(de)] <- 0     # replace NA values 
R> de 
    Row.names a b c d e f g h i j k l m n o p q r s 
1   1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10 11 12 13 14 15 16 17 18 19 
2   2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0 0 0 0 0 0 0 0 
3   3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 21 22 23 24 25 26 27 28 29 
    t 
1 20 
2 0 
3 30 
+0

,没有工作,谢谢。有什么方法可以提高性能吗?需要几分钟的时间来合并两列200k行,甚至需要花费几分钟时间才能将空数据框与具有200k行的单列数据框合并在一起...... – barbaz

+0

是的,请检查sqldf软件包:http://code.google .com/p/sqldf/ – rcs

+5

并且有什么方法可以保留行名?而不是让他们搬到专门的专栏?当然,之后可以做'rownames(de)= de $ Row.names',只是想知道是否有办法不把它打破在第一位... – barbaz