138

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

例如:

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

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

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

4

4 回答 4

156

使用suppressWarnings()

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

这会抑制警告。

于 2013-02-20T16:38:53.787 回答
38

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
于 2013-02-20T16:42:40.387 回答
33

一般来说,抑制警告并不是最好的解决方案,因为您可能希望在提供一些意外输入时得到警告。
下面的解决方案是在数据类型转换期间仅维护 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
于 2016-03-26T19:12:57.310 回答
1

我稍微修改了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
于 2020-07-07T08:56:52.087 回答