基于相似的列值将数据框拼接在一起

4
具体而言,假设我有三个数据框 d1, d2, d3d1:
       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对你有用,看一下reshape。 - pacomet
这实际上在效率方面比合并要好得多。谢谢! - Leeren
2个回答

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"))

您可以使用all=TRUE参数,以包含完整的行。缺失的数据将会变成NA。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接