【问题标题】:r data.table excluding rows with certain value in a column removes NAs toor data.table 排除列中具有特定值的行也会删除 NA
【发布时间】:2022-01-27 12:46:28
【问题描述】:

我在data.table 中遇到了这种意外行为。当排除具有特定值的行时,将删除特定列中具有 NAs 的行,如下例所示:

library(data.table)

dt_mtcars <- setDT(copy(mtcars))

set.seed(42)
na_rows <- runif(3, min = 1, max = nrow(mtcars))

dt_mtcars[ na_rows, cyl := NA]

dt_mtcars[ is.na(cyl), .N]
#> [1] 3

dt_mtcars <- dt_mtcars[ cyl != 4]

dt_mtcars[ is.na(cyl), .N]
#> [1] 0

reprex package 创建于 2022-01-27 (v2.0.1)

排除行而不是像

library(data.table)

dt_mtcars <- setDT(copy(mtcars))

set.seed(42)
na_rows <- runif(3, min = 1, max = nrow(mtcars))

dt_mtcars[ na_rows, cyl := NA]

dt_mtcars[ is.na(cyl), .N]
#> [1] 3

dt_mtcars <- dt_mtcars[ !cyl %in% 4]

dt_mtcars[ is.na(cyl), .N]
#> [1] 3

reprex package (v2.0.1) 于 2022-01-27 创建

确实有预期的结果。我在上面的第一个例子中期望同样的结果是错误的吗?或者这是data.table 中的错误?

【问题讨论】:

    标签: r data.table operators logical-operators


    【解决方案1】:

    这不是data.table 问题。

    在第一种情况下,您不选择NAs:

    NA != 4
    [1] NA
    

    在第二种情况下:

    !NA %in% 4
    [1] TRUE
    
    

    【讨论】:

    • 我发现这种行为真的很令人惊讶。看来NA 不能被 R 解释为合乎逻辑的。编辑:你说得对,这不是data.table 特定的问题。我用数据框对此进行了测试,得到了相同的结果。
    • @o_v,要将NA 解释为合乎逻辑的,您需要is.na。这种行为类似于SQL,其中NULL = NULL 不是TRUE
    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2022-06-13
    • 1970-01-01
    • 2015-05-06
    • 2015-10-19
    相关资源
    最近更新 更多