【问题标题】:Merging two data.tables with common ID but different Columns [duplicate]合并两个具有共同ID但不同列的data.tables [重复]
【发布时间】:2018-11-29 00:14:17
【问题描述】:

我尝试在 R 中基于一个共同的 ID 但不同的列组合两个 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。我想要的输出 data.table 将是:

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 争吵有时会给我带来很大的困难。

【问题讨论】:

    标签: r merge duplicates data.table


    【解决方案1】:

    只需进行完全联接。 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
    

    【讨论】:

    • 好的,非常感谢!!!这很完美。但是让我问你一个快速跟进,因为我想了解更多关于 r 数据整理技术的信息:如果我不仅有 2 个表,而且有 15 个不同的表,我该怎么办。 “合并”和“加入”似乎只占用两张桌子。将来知道这一点会很棒!
    • 不客气。如果您需要加入更多表,只需将它们链接起来。我已经更新了答案以说明如何做到这一点。
    • @TheLyrist 我喜欢的链式替代方案是purrr's reduce: purrr::reduce(list(df1, df2, df3, df4, df5), left_join, by = "Var")
    • @trijamms 谢谢!很高兴我学到了一些新东西。
    • 是的,谢谢大家。非常好的建议!! (但我认为应该有一个“full_join”而不是“left_join”)。
    猜你喜欢
    • 1970-01-01
    • 2019-03-17
    • 2020-05-28
    • 2020-10-27
    • 2021-12-13
    • 2021-03-15
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多