【问题标题】:"NAs introduced by coercion": warning with data.table::fifelse - but no NA in output“强制引入的 NA”:带有 data.table::fifelse 的警告 - 但输出中没有 NA
【发布时间】:2020-01-20 17:22:36
【问题描述】:

在使用fifelse 引用更新列时,我对以下警告感到困惑。

fifelse(char == "PL", 2, as.numeric(char)) 中的警告:强制引入的 NAs

但是没有NA!!

str(mydt) 表明类转换为数字已经成功。

谁能解释一下?

library(data.table)
mydt <- data.table(char = c('1','PL'))
mydt[, newcol := fifelse(char == 'PL', 2, as.numeric(char))]
#> Warning in fifelse(char == "PL", 2, as.numeric(char)): NAs introduced by
#> coercion
mydt
#>    char newcol
#> 1:    1      1
#> 2:   PL      2

reprex package (v0.3.0) 于 2020-01-20 创建

devtools::session_info()
    #>  data.table  * 1.12.6  2019-10-18 [1] CRAN (R 3.6.1)

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    它与fifelse 无关,因为它是as.numeric 的属性,当应用于非数字元素时,即当as.numeric(char) 时,非数字元素被强制转换为NA

    as.numeric(c("1", "PL"))
    #[1]  1 NA
    

    警告消息:强制引入的 NAs

    根据?fifelse,用法是

    fifelse(测试,是,否,na=NA)

    是,否 - 根据测试的 TRUE/FALSE 元素返回的值。它们必须是相同的类型,并且长度为 1 或相同的测试长度。

    因此,as.numeric 在整个列上被称为“否”参数,它确保它在整个列上而不是在其中的一部分上发生变化


    如果我们不想收到警告,请将as.numeric 包裹在fifelse 的外面或使用replace

    mydt[, newcol := as.numeric(replace(char, grepl('\\D', char), 2))]
    

    或者

    mydt[, newcol := as.numeric(fifelse(char == 'PL', '2', char))]
    

    fifelse 是特定类型的,因此,如果我们为“是”、“否”指定不同的类型,它会抱怨。选项是使用带有字符“2”的“yes”,然后在fifelse的输出上应用as.numeric

    【讨论】:

    • 我知道这一点。但这对我来说没有意义 - ifelse 语句应确保仅在可以转换为数字的向量元素上调用 as.numeric()
    • @Tjebo 您在整列而不是部分调用as.numeric
    • 这很有趣。因此,这 与 fifelse 的工作方式有关。
    • @Tjebo 实现与ifelse相同,但更优化
    • @Tjebo 我添加了一些修改
    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多