R 如何在通过强制引入NAs时避免警告

R 如何在通过强制引入NAs时避免警告,r,parsing,casting,na,R,Parsing,Casting,Na,我通常更喜欢对R进行编码,这样就不会收到警告,但我不知道如何避免在使用as.numeric转换字符向量时收到警告 例如: x <- as.numeric(c("1", "2", "X")) x使用suppressWarnings(): 这将抑制警告。suppressWarnings()。另一种方法是首先手动将有问题的字符转换为NA。对于您的特定问题,taRifx::destring就是这样做的。这样,如果从函数中得到一些其他意外的警告,它将不会被抑制 > library(taRif

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

例如:

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

这将抑制警告。

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
>库(taRifx)
>x y y
[1] 1 2 NA
>x
[1] 1 2 NA

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


我稍微修改了这个函数,以适应我们可能有很多无法转换成数字的值的情况。在我的函数中,执行模板搜索,如果未找到模板,则返回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

as.num.pattern请参见
?抑制警告
可能?此警告有什么问题?一般来说,它提供了有价值的信息。我更喜欢R控制台中更详细的输出,而不是令人讨厌的惊喜。@Roland我完全同意,但如果你习惯于忽略警告,警告的作用就会减弱。这就是为什么我通常喜欢“处理”这些警告。在这种情况下,我总是会生成警告,并且会产生很多警告——我的数据是以字符串的形式输入的,其中“X”表示NA,因此该函数正在执行我希望它执行的操作。我想说“谢谢你让我知道,但没关系,我知道我在做什么”
suppressWarnings
似乎很完美。您知道
read.table
接受参数
na.strings
?如果您已经找到了库中已知错误的解决方法,则可以抑制它们。这就是我要用的方法!这是最好的答案。使用
suppressWarnings()
通常是个坏主意,因为我们有时需要查看这些警告。我知道这是一个旧线程,
destring
非常适合op的示例,但是,对于将来看到此线程的任何人来说,一个警告是,当目标字符串是字符串和数字的混合体时,
destring
的工作方式不同于
as.numeric
:也就是说,
destring(“x1”)
给出的是
1
,但
as.numeric(“x1”)
给出了
NA
虽然这是首选的回答,但在我看来,jangorecki下面的回答似乎更为可靠。
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