【问题标题】:Merging data frames where key column isn't equal and retaining all unique values in both columns [duplicate]合并键列不相等的数据框并保留两列中的所有唯一值[重复]
【发布时间】:2018-07-07 11:40:17
【问题描述】:

这个问题被标记为重复,但我想对我的问题的答案表示赞同。另一个中提供的解决方案不足以满足我的目的(我尝试了它们但收效甚微),而且它们还依赖于看似细微且不必要的软件包。我感谢用户 Stewart Ross 对我的问题提供的答案,因为他们能够使用一个非常简单的解决方案来回答这个问题,该解决方案使用广泛使用且非常熟悉的包 (dplyr)

有人提出了类似的问题,这似乎很简单,但我找到的所有答案都已经产生了我已经得到的答案。 我似乎无法在两个数据框中保留所有唯一的行值。在我的情况下,我有两个数据框,我通过键列“代码”进行合并。但是,df1 来自前一年,因此它具有“代码”,即在 df2 中找不到的旧代码。同样,df2 具有 df1 中没有的新代码。

所以让我们假设它们看起来像这样:

df1
Code   Value1
A      10
B      20
C      50

df2
Code   Value2
A      30
D      40
E      60

使用我当前使用的代码 df3

所以我得到的是:

df3
Code   Value1   Value2
A      10       30
D      n.a.     40
E      n.a.     60

如果我只关心代表今年的“代码”,那就没问题了。 我想要的输出保留了上一年的旧代码。我希望 df3 类似于以下内容:

df3
Code  Value1  Value2
A    10      30
B    20      n.a.
C    50      n.a.
D    n.a.    40
E    n.a.    60

所以我的问题是我有两个具有不同代码的数据框,我想将它们合并在一起,同时保留所有代码。我无法通过使用 left_join、rbind 或子集来完成此操作。

任何帮助将不胜感激!

【问题讨论】:

    标签: r dataframe merge dplyr left-join


    【解决方案1】:

    dplyr 中的 full_join 函数完成了这项工作:

    library(dplyr)
    dfa = data.frame(code = c("A", "B" , "C"), value1 = c(10, 20, 50), stringsAsFactors = FALSE)
    dfb = data.frame(code = c("A", "D" , "E"), value2 = c(30, 40, 60), stringsAsFactors = FALSE)
    full_join(dfa, dfb)
    
    Joining, by = "code"
      code value1 value2
    1    A     10     30
    2    B     20     NA
    3    C     50     NA
    4    D     NA     40
    5    E     NA     60
    

    【讨论】:

    • 谢谢,我非常感谢这个解决方案,因为它使用 dplyr 而不是一些我没有使用经验的不熟悉的包。这绝对是我目前在网上找到的最好的解决方案。
    猜你喜欢
    • 2018-03-12
    • 2023-04-04
    • 1970-01-01
    • 2023-03-13
    • 2021-03-30
    • 2021-04-04
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多