合并具有相同ID但不同列的两个数据表

时间:2018-06-20 00:02:00

标签: r merge duplicates data.table

我尝试基于共同的ID但在不同的列中将R中的两个data.tables组合在一起,我也想删除重复的ID行。我的方法是:

dt1                       dt2
ID X1 Y1 Z1               ID X2 Y2 Z2        
1  a1 a2 a3               1  A1 A2 A3
2  b1 b2 b3               2  B1 NA B3
3  c1 c2 NA               3  C1 C2 C3
4  d1 d2 d3               5  E1 E2 E3
6  f1 f2 f3               6  F1 F2 F3 

使用rbind(dt1,dt2,fill = TRUE)给我:

dt_merged
ID X1 Y1 Z1 X2 Y2 Z2
1  a1 a2 a3 NA NA NA
1  NA NA NA A1 A2 A3
2  b1 b2 b3 NA NA NA
2  NA NA NA B1 NA B3
3  c1 c2 NA NA NA NA
3  NA NA NA C1 C2 C3
4  d1 d2 d3 NA NA NA
5  NA NA NA E1 E2 E3
6  f1 f2 f3 NA NA NA
6  NA NA NA F1 F2 F3

我的问题是,现在我不知道如何合并重复的行ID,并用重复的ID行中的相应数据填充NA。我想要的输出数据表将是:

ID X1 Y1 Z1 X2 Y2 Z2
1  a1 a2 a3 A1 A2 A3
2  b1 b2 b3 B1 NA B3
3  c1 c2 NA C1 C2 C3
4  d1 d2 d3 NA NA NA
5  NA NA NA E1 E2 E3
6  f1 f2 f3 F1 F2 F3

我希望我所说的描述足以让您对我的问题有一个总体了解。任何形式的帮助都会引起我的赞赏,并为我的愚蠢问题辩解,但是data.table的争吵有时使我很难受。

1 个答案:

答案 0 :(得分:3)

只需完全加入即可。使用dplyr包非常简单。 (或data.table包)

library(dplyr)

dt1 <- data.frame("ID" = c(1,2,3,4,6),
              "X1" = c("a1", "b1", "c1", "d1", "f1"),
              "Y1" = c("a2", "b2", "c2", "d2", "f2"),
              "Z1" = c("a3", "b3", NA, "d3", "f3")
              )                      


dt2 <- data.frame("ID" = c(1,2,3,5,6),
              "X2" = c("A1", "B1", "C1", "E1", "F1"),
              "Y2" = c("A2", NA, "C2", "E2", "F2"),
              "Z2" = c("A3", "B3", "C3", "E3", "F3")
              )                      
dt3 <- full_join(x = dt1, y = dt2, by = "ID") %>%
arrange(ID)

dt4 <- merge(dt1, dt2, by = "ID", all = TRUE)

dt3
dt4 

更新: 如果您需要连接更多表(按照OP的评论),只需将它们链接起来:

dt5 <- data.frame("ID" = c(1,3,4,5,7),
              "X3" = c("A1", "C1", "D1", "E1","G1"),
              "Y3" = c(NA, "C2", "D2", "E2", "G2"),
              "Z3" = c("A3","C3", "D3", "E3", NA)
)                      


dt6 <- full_join(x = dt1, y = dt2, by = "ID") %>%
  full_join( x = ., y = dt5, by = "ID") %>%
  arrange(ID)

dt6