首页 文章

dplyr left_join匹配NA

提问于
浏览
5

当沿着键连接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

2 回答

  • 2

    解决方案是使用参数 na_matches = "never" . 这是由Twitter上的Dani RabaiottiHadley Wickham指出的 .

    该参数记录在 tbl_df 类的 left_join 方法中: ?left_join.tbl_df

  • 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
    

相关问题