将 data.table 列与数值列中的 NA 进行比较
Comparing data.table columns with NAs in numerical columns
我今天刚看到一个奇怪的观察结果,即 data.table 中的一列中的 NA
不 return TRUE
或 FALSE
,但只是 NA
。这个问题有答案,但是只针对字符类型的列,把NA
改成''
不会影响数据。
有没有办法在不更改列的数据类型的情况下比较数据并取回 TRUE
或 FALSE
?
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)]
我今天刚看到一个奇怪的观察结果,即 data.table 中的一列中的 NA
不 return TRUE
或 FALSE
,但只是 NA
。这个问题NA
改成''
不会影响数据。
有没有办法在不更改列的数据类型的情况下比较数据并取回 TRUE
或 FALSE
?
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)]