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

Cor*_*one 112 parsing casting r na

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

例如:

x <- as.numeric(c("1", "2", "X"))
Run Code Online (Sandbox Code Playgroud)

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

或者我应该使用不同的功能来执行此任务?

And*_*rie 132

用途suppressWarnings():

suppressWarnings(as.numeric(c("1", "2", "X")))
[1]  1  2 NA
Run Code Online (Sandbox Code Playgroud)

这抑制了警告.


Ari*_*man 32

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
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一个旧线程,并且“destring”非常适合 op 的示例,但对于将来看到此线程的任何人来说,有一个警告是,当目标字符串是以下字符串的混合时,“destring”与“as.numeric”的工作方式不同字符串和数字:即 `destring("x1")` 给出 `1` 但 `as.numeric("x1")` 给出 `NA` (5认同)

jan*_*cki 19

通常,抑制警告不是最佳解决方案,因为您可能希望在提供某些意外输入时收到警告.
下面的解决方案是在数据类型转换期间仅保持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
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案.使用`suppressWarnings()`通常是一个坏主意,因为我们有时需要看到这些警告. (2认同)