2011-10-12 89 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