如何通过胁迫引入NA时避免警告

时间:2013-02-20 16:31:03

标签: r parsing casting na

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

例如:

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

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

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

5 个答案:

答案 0 :(得分:122)

使用suppressWarnings()

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

这会抑制警告。

答案 1 :(得分:30)

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

答案 2 :(得分:15)

一般来说,抑制警告不是最好的解决方案,因为当您提供一些意外输入时,您可能需要收到警告。
下面的解决方案是在数据类型转换期间仅保持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

答案 3 :(得分:0)

我对于要用于ggplot2散点图的y轴的数据框列有相同的问题,但是这是我解决的方法:

as.numeric(as.factor(columnName))

您可能会发现它也很有用,而不是使用suppressWarnings()

答案 4 :(得分:0)

对于我们可能具有无法转换为数字的各种值的情况,我对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