将 data.table 列与数值列中的 NA 进行比较

Comparing data.table columns with NAs in numerical columns

我今天刚看到一个奇怪的观察结果,即 data.table 中的一列中的 NA 不 return TRUEFALSE,但只是 NA。这个问题有答案,但是只针对字符类型的列,把NA改成''不会影响数据。 有没有办法在不更改列的数据类型的情况下比较数据并取回 TRUEFALSE

library(data.table)
dt <- data.table(a = c(1:10)
       , b = c(1:4,NA,6:10))

dt[a != b,]

在这种情况下,我希望得到第 5 行,因为在我看来 5 不等于 NA。如果有人能提供一些背景知识,说明为什么会发生这种情况,那就太好了。

这与 data.table 无关,这只是 ==!= 在 R 中的工作方式。但是,您可以通过使用 data.table::fcase 定义函数并使用而不是 ==.

基本行为的理由是,如果缺少一个值,它可能等于 5 或不等于,我们不知道。所以,少了一个值,比较的结果也少了。

library(data.table)

same <- function(x, y){
  fcase(is.na(x) != is.na(y), FALSE, 
        is.na(x), TRUE,
        rep(TRUE, length(x)), x == y)
}

x <- c(1, NA, NA, 4)
y <- c(1, 2, NA, 5)

same(x, y)
#> [1]  TRUE FALSE  TRUE FALSE
x == y
#> [1]  TRUE    NA    NA FALSE

reprex package (v2.0.1)

于 2021-12-03 创建

您也可以尝试 %in%

dt[! (a %in% b)]