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

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 覆盖第二个数据帧中的 ojit_code,而不会产生任何副作用。

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

最佳答案

跟进上述有用的评论

如果您没有提及要对数据框进行 left_join()merge() 的列名,则将考虑所有具有公共(public)列名的列。

您在 var2 列的最后两个位置获得 NA,因为这两个函数都使用 serialnovar1 列(df1 和 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

关于r - 合并和 dplyr 的 left_join 的意外行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30438554/

10-12 17:30
查看更多