dplyr inner_join 在字符列上有 NA

dplyr inner_join with NAs on character columns

我有两个相等的数据框

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

"return all rows from x where there are matching values in y, and all columns from x and y" dplyr documentation

(它们都是相等的)但它似乎不适用于 c 列中的 NA(类型 chr)。这是不加入 NA 的标准行为吗?

例如

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

没有加入 NA。但是,我希望它 return 与 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 指出的那样,当 NA 在因子列

中时,inner_join 也可以用作 merge
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 指出这是一个已知问题here and here

此问题出现在版本 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