【问题标题】:How to avoid warning when introducing NAs by coercion通过强制引入 NA 时如何避免警告
【发布时间】:2021-02-07 01:34:55
【问题描述】:

我通常更喜欢编写 R 代码,这样我就不会收到警告,但我不知道在使用 as.numeric 转换字符向量时如何避免收到警告。

例如:

x <- as.numeric(c("1", "2", "X"))

会给我一个警告,因为它通过强制引入了 NA。我想要强制引入的 NA - 有没有办法告诉它“是的,这就是我想要做的”。还是我应该接受警告?

或者我应该为此任务使用不同的功能吗?

【问题讨论】:

  • 也许看到?suppressWarnings
  • 这个警告有什么问题?通常它会提供有价值的信息。我更喜欢 R 控制台中更详细的输出而不是令人讨厌的惊喜。
  • @Roland 我完全同意,但是如果你习惯于忽略它们,警告的用处就会减少。这就是为什么我通常喜欢“处理”警告。在这种情况下,我总是会生成警告,而且其中有很多——我的数据以字符串形式出现,其中“X”代表 NA,因此该函数正在执行我希望它执行的操作。我想说“谢谢你让我知道,但没关系我知道我在做什么”。 suppressWarnings 看起来很完美。
  • 你知道read.table 接受一个参数na.strings
  • 如果您已经解决了库中的已知错误,那么抑制它们很有用。这就是我要使用它的方式!

标签: r parsing casting na


【解决方案1】:

使用suppressWarnings():

suppressWarnings(as.numeric(c("1", "2", "X")))
[1]  1  2 NA

这会抑制警告。

【讨论】:

  • 虽然这是首选响应,但对我来说,下面 jangorecki 的回答似乎更可靠。
【解决方案2】:

suppressWarnings() 已经被提及。另一种方法是先手动将有问题的字符转换为 NA。对于您的特定问题,taRifx::destring 就是这样做的。这样,如果您从函数中收到其他意外警告,则不会被抑制。

> library(taRifx)
> x <- as.numeric(c("1", "2", "X"))
Warning message:
NAs introduced by coercion 
> y <- destring(c("1", "2", "X"))
> y
[1]  1  2 NA
> x
[1]  1  2 NA

【讨论】:

  • 我知道这是一个旧线程,destring 非常适合 op 的示例,但是对于将来看到此线程的任何人来说,一个警告是 destringas.numeric 的工作方式不同,当目标字符串是字符串和数字的混合:也就是说,destring("x1") 给出 1as.numeric("x1") 给出 NA
【解决方案3】:

一般来说,抑制警告并不是最好的解决方案,因为您可能希望在提供一些意外输入时收到警告。
下面的解决方案是在数据类型转换期间仅维护 NA 的包装器。不需要任何软件包。

    as.num = function(x, na.strings = "NA") {
        stopifnot(is.character(x))
        na = x %in% na.strings
        x[na] = "0"
        x = as.numeric(x)
        x[na] = NA_real_
        x
    }
    as.num(c("1", "2", "X"), na.strings="X")
    #[1]  1  2 NA

【讨论】:

  • 这是最好的答案。使用suppressWarnings() 通常是个坏主意,因为我们有时需要查看这些警告。
【解决方案4】:

我稍微修改了jangorecki 函数,以应对我们可能有各种无法转换为数字的值的情况。在我的函数中,执行模板搜索,如果找不到模板,则返回 FALSE。!在gperl之前,这意味着我们需要那些与模板不匹配的向量元素。其余的类似于as.num 函数。示例:

as.num.pattern <- function(x, pattern){
  stopifnot(is.character(x))
  na = !grepl(pattern, x)
  x[na] = -Inf
  x = as.numeric(x)
  x[na] = NA_real_
  x
}

as.num.pattern(c('1', '2', '3.43', 'char1', 'test2', 'other3', '23/40', '23, 54 cm.'))

[1] 1.00 2.00 3.43   NA   NA   NA   NA   NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多