强制引入NA时如何避免警告


124

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

例如:

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

请给我一个警告,因为它以强制方式引入了NA。我要强制使用NA -是否有办法告诉它“是的,这就是我想要做的”。还是我应该只接受警告?

还是应该为此任务使用其他功能?


8
看到?suppressWarnings也许吗?
13年

4
此警告有什么问题?通常,它提供有价值的信息。我更喜欢R控制台中更详细的输出,而不是令人讨厌的惊喜。
罗兰

12
@Roland我完全同意,但是如果您习惯于不理会警告,警告的用处就会减少。这就是为什么我通常喜欢“处理”警告的原因。在这种情况下,我将始终生成警告,并且有很多警告-我的数据以字符串形式出现,字符串中以“ X”表示NA,因此该函数完全按照我的意愿进行操作。我想说“谢谢你让我知道,但是我知道我在做什么是可以的”。 suppressWarnings看起来很完美。
Korone

6
你知道read.table接受论点na.strings吗?
罗兰

如果您已经解决了库中的已知错误,则抑制它们很有用。这就是我要使用的方式!
Clem Wang

Answers:


142

用途suppressWarnings()

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

这样可以抑制警告。


尽管这是首选的回答,但在我看来,下面的jangorecki的回答似乎更可靠。
伊恩

34

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
我知道这是一个旧线程,destring非常适合op的示例,但是对于将来看到此线程的任何人来说,一个警告是,其destring工作方式as.numeric与目标字符串是字符串和数字的混合时不同:即,destring("x1")给出1as.numeric("x1")给出NA
Hong

26

通常,抑制警告并不是最好的解决方案,因为当某些意外输入将被警告时,您可能会被警告。
下面的解决方案是用于在数据类型转换期间仅维护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

4
这是最好的答案。使用suppressWarnings()通常是一个坏主意,因为有时我们需要查看这些警告。
keberwein

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.