【问题标题】:How can I join 2 tables with dplyr and keep all columns from the RHS table?如何使用 dplyr 加入 2 个表并保留 RHS 表中的所有列?
【发布时间】:2019-03-28 18:50:38
【问题描述】:

这里有 2 个数据框:

df1 <- data.frame(ID=c(1,2,3,4))
df1
df2 <- data.frame(ID=c(1,3))
df2

我怎样才能加入他们以获得以下输出?:

#  ID.1 ID.2
#     1    1
#     2 
#     3    3
#     4 

谢谢!

【问题讨论】:

  • 你想加入什么?这是您遇到的实际问题,还是您的实际数据集有一个 ID 列,您可以对其进行正常连接?
  • 我正在尝试加入 ID 列。我应该提到,如果可能的话,我正在寻找一个 dplyr 解决方案。但是 dplyr 连接似乎总是默认删除重复的列,所以我无法得到我正在寻找的输出。
  • 为什么要复制该列,因为它不包含其他地方没有的信息?
  • 感谢您的提问 - 第二列代表客户 ID 的子集,例如“女性” - 我需要指出这一点。因此,我使用第二列来标记第一列中的客户。我曾想过使用 mutate 操作而不是 join,但我的第二个数据框中有数千万行,所以我认为 join 会更有效。

标签: r dplyr left-join


【解决方案1】:

试试dplyr::left_joinkeep = TRUE

> left_join(df1, df2, keep = TRUE, suffix = c('.1', '.2'), by = 'ID')
  ID.1 ID.2
1    1    1
2    2   NA
3    3    3
4    4   NA

【讨论】:

    【解决方案2】:

    一个选项是使用match

    data.frame(ID.1 = df1$ID, ID.2 = df2$ID[match(df1$ID, df2$ID)])
    #   ID.1 ID.2
    #1    1    1
    #2    2   NA
    #3    3    3
    #4    4   NA
    

    【讨论】:

    • @Rez99 希望现在匹配
    • 谢谢,这行得通!您是否也知道对此的 dplyr 解决方案?
    【解决方案3】:

    您可以在加入之前复制 df2 中的 ID 列:

    library(tidyverse)
    
    df1 <- data.frame(ID=c(1,2,3,4))
    df2 <- data.frame(ID=c(1,3)) %>% 
      mutate(ID.2 = ID)
    
    df1 %>% 
      left_join(df2, by = c("ID" = "ID"))
    
      ID ID.2
    1  1    1
    2  2   NA
    3  3    3
    4  4   NA
    

    【讨论】:

    • 或者如果你想在管道内复制library(dplyr) df1 %&gt;% rename(ID.1 = ID) %&gt;% left_join(df2 %&gt;% mutate(ID.2 = ID), by = c("ID.1" = "ID"))
    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多