当沿着键加入data.frames,并且一个键具有缺失值(NA)时,我的直觉是具有NA键的行在第二个data.frame中应该没有匹配。令我惊讶的是,如果两个data.frame中都有NA,则dplyr将它们匹配,就像它们是值一样。
这是一个额外的混乱,因为这已经详细讨论了dplyr存储库see here中的问题,似乎已经解决了!如果是这样,我没有看到这是正确的解决方案;或许我错过了什么
我正在使用dplyr 0.7.4
t1 <- data.frame(a = as.character(c("1", "2", NA, NA, "4", "2")), b = c(1, 2, 3, 3, 4, 5), stringsAsFactors = FALSE)
t2 <- data.frame(a = as.character(c("1", "2", NA)), c = c("b", "n", "i"), stringsAsFactors = FALSE)
library(dplyr)
t1
#> a b
#> 1 1 1
#> 2 2 2
#> 3 <NA> 3
#> 4 <NA> 3
#> 5 4 4
#> 6 2 5
t2
#> a c
#> 1 1 b
#> 2 2 n
#> 3 <NA> i
left_join(t1, t2, by = "a")
#> a b c
#> 1 1 1 b
#> 2 2 2 n
#> 3 <NA> 3 i
#> 4 <NA> 3 i
#> 5 4 4 <NA>
#> 6 2 5 n
事实上,我原本期望以下内容:
#> a b c
#> 1 1 1 b
#> 2 2 2 n
#> 3 <NA> 3 <NA>
#> 4 <NA> 3 <NA>
#> 5 4 4 <NA>
#> 6 2 5 n
答案 0 :(得分:2)
解决方案是使用参数na_matches = "never"
。 Dani Rabaiotti和Hadley Wickham在Twitter上指出了这一点。
left_join
类的tbl_df
方法记录了此参数:?left_join.tbl_df
答案 1 :(得分:0)
此行为与merge
相同(尽管有一些重新排序)。
merge(t1,t2,all.x=T)
a b c
1 1 1 b
2 2 2 n
3 2 5 n
4 4 4 <NA>
5 <NA> 3 i
6 <NA> 3 i
您可以通过设置incomparables=NA
:
merge(t1,t2,all.x=T,incomparables=NA)
a b c
1 1 1 b
2 2 2 n
3 2 5 n
4 4 4 <NA>
5 <NA> 3 <NA>
6 <NA> 3 <NA>
在dplyr
中,此选项似乎没有记录,但查看dplyr:::left_join.tbl_df
您可以看到na_matches
看起来很有希望。一些玩游戏显示你需要给它值"never"
。
left_join(t1,t2,by="a",na_matches="never")
a b c
1 1 1 b
2 2 2 n
3 <NA> 3 <NA>
4 <NA> 3 <NA>
5 4 4 <NA>
6 2 5 n