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
此问题出现在版本 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
我有两个相等的数据框
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
此问题出现在版本 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