gpt4 book ai didi

r - 合并和 dplyr 的 left_join 的意外行为

转载 作者:行者123 更新时间:2023-12-04 09:42:52 24 4
gpt4 key购买 nike

我注意到 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.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在连接中第一个指定的数据框中覆盖第二个数据框中的数据框,而不会产生任何副作用。

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

最佳答案

跟进上述有用的评论

如果你没有提到你想要的列名left_join()merge()数据框,然后将考虑所有具有公共(public)列名的列。

你得到NA在 var2 列的最后两个位置,因为这两个函数都使用 serialno 合并数据帧和 var1列(在 df1 和 df2 之间通用),以及列 var1 的所有值在 df1 和 df2 中不匹配。

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

在你的情况下

# 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com