Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
merge和dplyr'的意外行为;s左键连接_R_Merge_Left Join - Fatal编程技术网

merge和dplyr'的意外行为;s左键连接

merge和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

我注意到base
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