dplyr inner_join与字符列上的NAs

时间:2015-05-29 04:06:31

标签: r inner-join dplyr

我有两个相等的数据框

a <- c(1,2,3)
b <- c(3,2,1)
c <- c('a','b',NA)

df1 <- data.frame(a=a, b=b, c=c, stringsAsFactors=FALSE)
df2 <- data.frame(a=a, b=b, c=c, stringsAsFactors=FALSE)

我想使用dplyr::inner_join

  

&#34;返回x中匹配值的所有行,以及x和y&#34;中的所有列。 dplyr documentation

(这是一切都是平等的)但它似乎不适用于NA列中的c(类型chr)。此标准行为是否未加入NA s?

例如

library(dplyr)
> inner_join(df1, df2)
Joining by: c("a", "b", "c")
  a b c
1 1 3 a
2 2 2 b

没有加入NA。但是,我希望它返回与merge

相同的内容
> merge(df1, df2)
  a b    c
1 1 3    a
2 2 2    b
3 3 1 <NA>

我是否误解了inner_join在这个实例中是如何工作的,这是否符合描述?

进一步详情

inner_join在数字列上匹配NA

a <- c(1,2,3)
b <- c(3,2,NA)
c <- c('a','b','c')

df1 <- data.frame(a=a, b=b, c=c, stringsAsFactors=FALSE)
df2 <- data.frame(a=a, b=b, c=c, stringsAsFactors=FALSE)

> inner_join(df1, df2)
Joining by: c("a", "b", "c")
  a  b c
1 1  3 a
2 2  2 b
3 3 NA c

修改

正如@thelatemail指出的那样,当inner_join位于因子列中时,merge也可用作NA

df1 <- data.frame(a=a, b=b, c=c, stringsAsFactors=T)
df2 <- data.frame(a=a, b=b, c=c, stringsAsFactors=T)
inner_join(df1, df2)
Joining by: c("a", "b", "c")
  a b    c
1 1 3    a
2 2 2    b
3 3 3 <NA>

修改2

感谢@shadow指出这是一个已知问题herehere

1 个答案:

答案 0 :(得分:0)

此问题发生在0.4.1版本中。现在已在版本0.4.2中修复此问题:

sessionInfo()
...
other attached packages:
[1] dplyr_0.4.2
...

> inner_join(df1, df2)
Joining by: c("a", "b", "c")
  a b    c
1 1 3    a
2 2 2    b
3 3 1 <NA>

检查合并:

> merge(df1, df2)
  a b    c
1 1 3    a
2 2 2    b
3 3 1 <NA>

> all.equal(inner_join(df1, df2), merge(df1, df2))
Joining by: c("a", "b", "c")
[1] TRUE