通过组ID合并两个不同长度的数据帧

时间:2019-05-17 08:16:09

标签: r merge

我正在尝试按组ID合并两个数据帧。但是,两个数据帧的长度都不相同,并且第二个数据帧中缺少某些组的某些元素。在合并的文件中,某个组的缺失元素应为NA。

数据看起来像这样

df1 <- data.frame(id = c(1,1,1,2,3,3,4), x = c("a", "b", "c", "d", "e", "f", "g"))
df2 <- data.frame(id = c(1,1,2,3,4), y = c("A", "B", "D", "E", "G"))

理想情况下,结果如下所示:

id  x    y
1   a    A
1   b    B
1   c <NA>
2   d    D
3   e    E
3   f <NA>
4   g    G

如果代码可用于也对应于相同组ID但可能会丢失不同位置元素的其他列,那就太好了。

到目前为止,我已经尝试过full_joinmerge,但没有成功,因为它们只是表示y值而不是引入na。

我知道那里也有类似的问题,但是我发现没有一个可以解决这个问题。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

data.table解决方案可能有效。.

首先,为每个组创建row_id。这些行ID上的ID联接。

library(data.table)
dt1 <- data.table(id = c(1,1,1,2,3,3,4), x = c("a", "b", "c", "d", "e", "f", "g"))
dt2 <- data.table(id = c(1,1,2,3,4), y = c("A", "B", "D", "E", "G"))

#rumber rows by group
dt1[ , row_id := seq.int(1:.N), by = .(id)]
dt2[ , row_id := seq.int(1:.N), by = .(id)]

dt1[dt2, y := i.y, on = .(id, row_id)][, row_id := NULL][]

#    id x    y
# 1:  1 a    A
# 2:  1 b    B
# 3:  1 c <NA>
# 4:  2 d    D
# 5:  3 e    E
# 6:  3 f <NA>
# 7:  4 g    G