2015-05-07 54 views
4

具体而言,说我有三个数据帧d1, d2, d3连接的数据帧一起基于类似的列的值

d1

 X  Y Z value 
1  0 20 135 43 
2  0  4 105 50 
3  5 18 20 10 
... 

d2

 X  Y Z value 
1  0 20 135 15 
2  0  4 105 14 
3  2  9 12 16 
... 

d3

 X  Y Z value 
1  0 20 135 29 
2  2  9 14 16 
... 

我希望能够合并这些数据帧,使得组合数据帧的每一行由三个值组成,这些值基于所有独特的X,Y,Z组合。如果这样一个X,Y,Z组合不存在于其中一个原始数据帧中,那么我只是希望它的值为null(或者如果这是不可能的,则为任意低的数字)。所以我想的输出:

dfinal

 X  Y Z value1 value2 value3 
1  0 20 135  43  15  29 
2  0  4 105  50  14  null 
3  5 18 20  10  null null 
4  2  9 12 null  16  null 
5  2  9 14 null null  16 
... 

是否有这样做的任何有效的方法?我试过这样做,而不是使用data.table这似乎更适合这个,但还没有弄清楚如何。

+1

也许@http://stackoverflow.com/a/26738724/709777可能对您有用,看看重塑 – pacomet

+0

这其实工作起来在效率方面比合并更好。谢谢! – Leeren

回答

6
?merge 

应该这样做吗?

By default the data frames are merged on the columns with names they both have, but separate specifications of the columns can be given by by.x and by.y. 

所以:

merge(d1,d2, by=c("X","Y","Z")) 

而且你可以包括所有= T,有完整的行。 丢失的数据将是NA

merge(d1,d2, by=c("X","Y","Z"), all=T) 
+0

这个很棒!谢谢。 – Leeren

2

看看dplyr及其连接方法。我写了一个小例子:

library(dplyr) 
library(data.table) 

d1 <- data.table(X = c(1,2,3), Y = c(2,3,4), Z = c(8,3,9), value = c(22,3,44)) 
d2 <- data.table(X = c(1,4,3), Y = c(2,6,4), Z = c(8,9,9), value = c(44,22,11)) 

d2 <- rename(d2, value2 = value) 


full_join(d1,d2) 

输出:

X Y Z value value2 
1 1 2 8 22  44 
2 2 3 3  3  NA 
3 3 4 9 44  11 
4 4 6 9 NA  22 
+0

这个效果很好!谢谢。 – Leeren

相关问题