merge 和 dplyr 的意外行为 left_join

Unexpected behavior with merge and dplyr's left_join

我注意到基础 R 中的 merge 函数以及 dplyrleft_join 函数出现了意外行为。 以下是数据的最小示例:

df1 <- read.table(text="serialno   var1 pos_var1
1       C001        NA       NA
2       C002        NA       NA
3       C003 0.1790000        1
4       C004        NA       NA
5       C007 0.0645000        1
6       C010 0.3895000        1
11      C016 0.2805000        1
12      C017 0.7805001        1", header=T, stringsAsFactors=F)

df1
serialno      var1  pos_var1
1      C001        NA       NA
2      C002        NA       NA
3      C003 0.1790000        1
4      C004        NA       NA
5      C007 0.0645000        1
6      C010 0.3895000        1
11     C016 0.2805000        1
12     C017 0.7805001        1

df2 <- read.table(text="serialno   var1  var2
1      C003 0.1790 1.1305
2      C007 0.0645 0.2985
3      C010 0.3895 0.1705
4      C016 0.1740 0.3980
5      C017 0.4840 0.3375", header=T, stringsAsFactors=F)

df2
serialno   var1     var2
1     C003 0.1790 1.1305
2     C007 0.0645 0.2985
3     C010 0.3895 0.1705
4     C016 0.1740 0.3980
5     C017 0.4840 0.3375

left_join(df1,df2)
Joining by: c("serialno", "var1")
serialno      var1 pos_var1  var2
1     C001        NA       NA     NA
2     C002        NA       NA     NA
3     C003 0.1790000        1 1.1305
4     C004        NA       NA     NA
5     C007 0.0645000        1 0.2985
6     C010 0.3895000        1 0.1705
7     C016 0.2805000        1     NA
8     C017 0.7805001        1     NA

我预计 var2 的最后两个值是 0.39800.3375 而不是 NAs。 我得到与 merge 类似的结果:

merge(df1,df2, all.x=T)
serialno      var1 pos_var1  var2
1     C001        NA       NA     NA
2     C002        NA       NA     NA
3     C003 0.1790000        1 1.1305
4     C004        NA       NA     NA
5     C007 0.0645000        1 0.2985
6     C010 0.3895000       NA 0.1705
7     C016 0.2805000        1     NA
8     C017 0.7805001        1     NA

然而,当我在两个数据框中省略变量var1时(注意两个数据框中的var1变量除了小数位是相同的)问题得到解决:

left_join(df1[,-2],df2[,-2])
Joining by: "serialno"
serialno pos_var1  var2
1     C001       NA     NA
2     C002       NA     NA
3     C003        1 1.1305
4     C004       NA     NA
5     C007        1 0.2985
6     C010       NA 0.1705
7     C016        1 0.3980
8     C017        1 0.3375

所以问题似乎是由 var1 冲突引起的,但我希望连接中第一个指定的数据框中的 var1 覆盖第二个数据框中的 var1 而没有任何副作用。

我将不胜感激关于如何解决这个问题的任何建议或关于这是否是一个值得研究解决的问题的评论? 我四处寻找解决类似问题的相关帖子,但它们没有解决我的具体问题。特别是,这些帖子的问题是由于类型差异造成的,例如如果第一个数据框中的一个变量是一个字符,而另一个数据框中的相应变量是一个因子,或者如果一个是整数而另一个是数字,例如 Incorrect behavior with dplyr's left_join?

在跟进以上有用的评论

如果您没有提及要用于 left_join()merge() 数据框的列名,那么将考虑具有通用列名的所有列。

您在 var2 列的最后两个位置得到 NA,因为这两个函数都使用 serialnovar1 列合并数据框 (通用between df1 and df2),并且df1和df2中列var1的所有值都不匹配。

因此,如果您愿意合并两个数据框,最好提及您需要合并或加入的列名

你的情况

# using merge()
merge(df1, df2, by = c('serialno'), all.x=T)

#> merge(df1,df2, by = c('serialno'), all.x=T)
#serialno    var1.x pos_var1 var1.y   var2
#1     C001        NA       NA     NA     NA
#2     C002        NA       NA     NA     NA
#3     C003 0.1790000        1 0.1790 1.1305
#4     C004        NA       NA     NA     NA
#5     C007 0.0645000        1 0.0645 0.2985
#6     C010 0.3895000        1 0.3895 0.1705
#7     C016 0.2805000        1 0.1740 0.3980
#8     C017 0.7805001        1 0.4840 0.3375

# using left_join()
left_join(df1, df2, by = c("serialno"))

#> left_join(df1, df2, by = c("serialno"))
#serialno    var1.x pos_var1 var1.y   var2
#1     C001        NA       NA     NA     NA
#2     C002        NA       NA     NA     NA
#3     C003 0.1790000        1 0.1790 1.1305
#4     C004        NA       NA     NA     NA
#5     C007 0.0645000        1 0.0645 0.2985
#6     C010 0.3895000        1 0.3895 0.1705
#7     C016 0.2805000        1 0.1740 0.3980
#8     C017 0.7805001        1 0.4840 0.3375