合并关键列不相等的数据框,并保留两列

时间:2018-01-28 18:44:47

标签: r dataframe merge dplyr left-join

此问题被标记为重复,但我想对我的问题的答案表示赞同。另一方提供的解决方案不足以达到我的目的(我试过它们取得了一点成功),而且他们也依赖于看似微妙和不必要的软件包。我很欣赏用户Stewart Ross提供的问题,因为他们能够使用一个广泛使用且非常熟悉的软件包(dplyr)使用一个非常简单的解决方案来回答这个问题

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

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

df1
Code   Value1
A      10
B      20
C      50

df2
Code   Value2
A      30
D      40
E      60

使用我正在使用的当前代码 df3< - left_join(df2,df1,by =“Code”)

所以我得到的是:

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或subsetting完成此操作。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

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