dplyr inner_join与字符列上的NAs

tos*_*pig 7 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)
Run Code Online (Sandbox Code Playgroud)

我想用dplyr::inner_join

"返回x中匹配值的所有行,x和y中的所有列" dplyr文档

(这是它们相同的一切)但它似乎不适用于NAin c(列)(类型chr).这个标准行为是不加入NAs?

例如

library(dplyr)
> inner_join(df1, df2)
Joining by: c("a", "b", "c")
  a b c
1 1 3 a
2 2 2 b
Run Code Online (Sandbox Code Playgroud)

没有加入NA.但是,我希望它返回相同的merge

> merge(df1, df2)
  a b    c
1 1 3    a
2 2 2    b
3 3 1 <NA>
Run Code Online (Sandbox Code Playgroud)

我是否误解了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
Run Code Online (Sandbox Code Playgroud)

编辑

作为@thelatemail指出,inner_join也可以作为mergeNA是一个因素列

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>
Run Code Online (Sandbox Code Playgroud)

编辑2

由于@shadow指出这个是一个已知的问题,在这里这里

tos*_*pig 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>
Run Code Online (Sandbox Code Playgroud)

检查合并:

> 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
Run Code Online (Sandbox Code Playgroud)