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

How to avoid warning when introducing NAs by coercion

提问人:Corvus 提问时间:2/21/2013 更新时间:10/19/2023 访问量:272236

问:

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

例如:

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

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

或者我应该为此任务使用不同的函数?

r 解析 铸造 NA

评论

8赞 A5C1D2H2I1M1N2O1R2T1 2/21/2013
也许看到了??suppressWarnings
4赞 Roland 2/21/2013
这个警告有什么问题?通常,它提供了有价值的信息。我更喜欢 R 控制台中更冗长的输出,而不是令人讨厌的惊喜。
13赞 Corvus 2/21/2013
@Roland我完全同意,但如果你习惯于忽略它们,警告的用处就会减弱。这就是为什么我通常喜欢“处理”警告的原因。在这种情况下,我总是会生成警告,而且很多警告 - 我的数据是以字符串形式输入的,其中“X”代表 NA,因此该函数正在执行我想要它执行的操作。我想说“谢谢你让我知道,但没关系,我知道我在做什么”。 看起来很完美。suppressWarnings
6赞 Roland 2/21/2013
你知道接受一个论点吗?read.tablena.strings
0赞 Clem Wang 1/8/2019
如果您已经对库中的已知 bug 有解决方法,那么禁止它们很有用。这就是我将如何使用它!

答:

162赞 Andrie 2/21/2013 #1

用:suppressWarnings()

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

这将禁止显示警告。

评论

1赞 Ian 7/6/2020
虽然这是首选的回答,但在我看来,下面jangorecki的答案似乎更可靠。
40赞 Ari B. Friedman 2/21/2013 #2

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

评论

6赞 Hong 3/18/2020
我知道这是一个旧线程,非常适合 op 的示例,但对于将来看到此线程的任何人来说,一个警告是,它的工作方式与目标字符串是字符串和数字的混合时不同:也就是说,给予但给予destringdestringas.numericdestring("x1")1as.numeric("x1")NA
0赞 Urasquirrel 6/19/2022
库(taRifx)中的错误:没有名为“taRifx”的包,只有Zuul。knowyourmeme.com/memes/there-is-no-dana-only-zuul
39赞 jangorecki 3/27/2016 #3

通常,禁止显示警告不是最佳解决方案,因为您可能希望在提供一些意外输入时收到警告。
下面的解决方案是在数据类型转换期间仅维护 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

评论

6赞 keberwein 9/27/2017
这是最好的答案。使用通常是一个坏主意,因为我们有时需要看到这些警告。suppressWarnings()
0赞 Ben Bolker 10/18/2023
这很好,但它仅适用于已知模式。
1赞 Vladislav Shufinskiy 7/7/2020 #4

我稍微修改了 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

评论

0赞 ckx 6/17/2022
该示例目前不会运行,因为尚未指定。 将重现结果。patternas.num.pattern(c('1', '2', '3.43', NA, 'char1', 'test2', 'other3', '23/40', '23, 54 cm.'),pattern = "^[0-9\\.,]+$")
0赞 scottkosty 7/14/2023 #5

仅静默特定警告的一种方法是,根据警告列表中的位置或 R 中的正则表达式,使用“禁止显示警告”中的方法

编辑:请注意,这种方法对语言环境更改/翻译并不可靠(感谢 Ben Bolker 指出这一点)。

以下是特定 OP 案例的完整示例:

with_warning_handler <- function(reg, ...)
{
  withCallingHandlers(..., warning = function(w)
    {
        condition <- conditionMessage(w)
        if(grepl(reg, condition)) invokeRestart("muffleWarning")
  })
}


with_warning_handler("NAs introduced by coercion",
  x <- as.numeric(c("1", "2", "X"))
)

评论

0赞 Ben Bolker 10/18/2023
这对于区域设置更改/将警告消息翻译成其他语言并不可靠。
0赞 scottkosty 10/19/2023
@BenBolker 好点子!谢谢。我编辑以添加这种担忧。