提问人:Corvus 提问时间:2/21/2013 更新时间:10/19/2023 访问量:272236
通过胁迫引入NA时如何避免警告
How to avoid warning when introducing NAs by coercion
问:
我通常更喜欢编码,这样我就不会收到警告,但我不知道如何在用于转换字符向量时避免收到警告。as.numeric
例如:
x <- as.numeric(c("1", "2", "X"))
会给我一个警告,因为它通过胁迫引入了 NA。我想要通过胁迫引入的 NA - 有没有办法告诉它“是的,这就是我想做的”。还是我应该忍受警告?
或者我应该为此任务使用不同的函数?
答:
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 的示例,但对于将来看到此线程的任何人来说,一个警告是,它的工作方式与目标字符串是字符串和数字的混合时不同:也就是说,给予但给予destring
destring
as.numeric
destring("x1")
1
as.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
该示例目前不会运行,因为尚未指定。 将重现结果。pattern
as.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 好点子!谢谢。我编辑以添加这种担忧。
评论
?suppressWarnings
suppressWarnings
read.table
na.strings