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

Posted

技术标签:

【中文标题】将 data.table 列与数值列中的 NA 进行比较【英文标题】:Comparing data.table columns with NAs in numerical columns 【发布时间】:2022-01-09 22:13:00 【问题描述】:

我今天刚刚发现一个奇怪的观察结果,即 data.table 内的列中的 NAs 不会返回 TRUEFALSE,而只会返回 NA。这个问题Comparing Column Values With 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。如果有人能提供一些背景说明为什么会发生这种情况,那也太好了。

【问题讨论】:

就像你刚才说的比较 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 替换为组中的第一个值?

从R中的data.table中删除带有NA的行[重复]

如何替换表*中的NA值以用于所选列*? data.frame,data.table

检查一个 data.table 列中的所有元素以查看另一个 data.table 列中出现的每个值的最快方法

熊猫日期列中的不同格式 - 列与行的数据类型