【发布时间】:2015-05-25 12:35:38
【问题描述】:
我注意到基础R 中的merge 函数以及dplyr 的left_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.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 覆盖第二个数据框中的var1 而不会产生任何副作用。
如果有任何关于如何克服这个问题的建议,或者关于这个问题是否值得解决的问题,我将不胜感激? 我四处寻找解决类似问题的相关帖子,但它们没有解决我的具体问题。特别是,这些帖子的问题是由于类型差异,例如如果第一个数据框中的一个变量是字符,而另一个数据框中的相应变量是一个因子,或者如果一个是整数而另一个是数字,例如 Incorrect behavior with dplyr's left_join?
【问题讨论】:
-
根据文档,这种行为既是预期的,也是一致的。我不知道这些问题是关于什么的。连接是在两个数据集中的相互列名上执行的。如果没有加入,您将收到
NA,您还期望得到什么? -
我预计结果是由
left_join(df1[,-2],df2[,-2])生成的结果,但另外还有第一个数据帧的var1中的列(在覆盖第二个数据帧中的var1之后)。但我想我需要更多地了解合并的逻辑 -
当您通过 两个 列执行左连接时,合并将尝试匹配
df1中每一行的 both,所以如果一个的列不匹配,这将返回NA。