【问题标题】:Comparing data.table columns with NAs in numerical columns将 data.table 列与数值列中的 NA 进行比较
【发布时间】: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 := '']更改它是行不通的。

标签: r data.table


【解决方案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)]

【讨论】:

    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多