merge和dplyr'的意外行为;s左键连接
我注意到basemerge和dplyr'的意外行为;s左键连接,r,merge,left-join,R,Merge,Left Join,我注意到baseR中的merge函数以及dplyr的left\u 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
R
中的merge
函数以及dplyr
的left\u 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
但是,当我在两个数据帧中省略变量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,而不会产生任何副作用
如果您能就如何克服这个问题提出建议,或者对这个问题是否值得考虑解决提出意见,我将不胜感激?
我到处找过相关的帖子,这些帖子解决了类似的问题,但没有解决我的具体问题。特别是,这些帖子的问题是由于类型差异造成的,例如,如果第一个数据框中的一个变量是字符,而另一个数据框中的相应变量是因子,或者如果一个是整数,另一个是数字,例如。
以上有用评论的后续内容
如果不提及要与数据帧左\u连接()
或合并()
的列名,则将考虑所有具有公共列名的列
您在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
这种行为是预期的,并且符合文件要求。我不知道这些问题是关于什么的。对两个数据集中的共同列名称执行联接。如果没有连接,您将收到一个NA
,您还希望得到什么?我希望结果是由left_-join(df1[,-2],df2[,-2])
生成的,但是除了第一个数据帧的var1
中的列之外(在第二个数据帧中重写var1
之后)。但是我想我需要更多地理解merging的逻辑当你执行两列的左连接时,merge将尝试在df1
中的每一行匹配这两个列,因此如果其中一列不匹配,这将返回一个NA
。由于我需要一个var1
,且var1.x
优先,因此我需要进一步删除var1.y
(或任何其他此类变量),并根据需要将var1.x
重命名为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