我注意到基础 merge
中的 R
函数以及 left_join
的 dplyr
函数出现了意外行为。
以下是数据的最小示例:
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.3980
和 0.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
,因为这两个函数都使用 serialno
和 var1
列(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/