将 data.table 列与数值列中的 NA 进行比较
Posted
技术标签:
【中文标题】将 data.table 列与数值列中的 NA 进行比较【英文标题】:Comparing data.table columns with NAs in numerical columns 【发布时间】:2022-01-09 22:13:00 【问题描述】:我今天刚刚发现一个奇怪的观察结果,即 data.table 内的列中的 NA
s 不会返回 TRUE
或 FALSE
,而只会返回 NA
。这个问题Comparing Column Values With 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。如果有人能提供一些背景说明为什么会发生这种情况,那也太好了。
【问题讨论】:
就像你刚才说的比较 NA 返回 NA 而不是 TRUE 或 FALSE 这就是为什么它没有给出 5 与 NA 不同的“预期”结果并且将 NA 更改为 '' 确实适用于数字也是。 不,它不适用于数字,如果列是整数,则再次导致 NA。 我复制粘贴了您的代码并将 NA 替换为 '' 并且它起作用了 好吧,但是该列从一开始就是字符而不是整数。如果你想通过dt[is.na(b), b := '']
更改它是行不通的。
见Comparing Column Values With NA
【参考方案1】:
这与 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 创建
【讨论】:
好的,谢谢。然后我需要添加我的专业知识来告诉 R 值不一样 ;-)【参考方案2】:你也可以试试%in%
dt[! (a %in% b)]
【讨论】:
以上是关于将 data.table 列与数值列中的 NA 进行比较的主要内容,如果未能解决你的问题,请参考以下文章
在双错误类型的连接列中使用 NA 的 data.table 内部/外部连接?
如何填充(自动填充)值,例如使用 R 中的 data.table 将 NA 替换为组中的第一个值?
如何替换表*中的NA值以用于所选列*? data.frame,data.table