How to avoid warning when introducing NAs by coerc

2019-01-06 09:14发布

I generally prefer to code R so that I don't get warnings, but I don't know how to avoid getting a warning when using as.numeric to convert a character vector.

For example:

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

Will give me a warning because it introduced NAs by coercion. I want NAs introduced by coercion - is there a way to tell it "yes this is what I want to do". Or should I just live with the warning?

Or should I be using a different function for this task?

4条回答
姐就是有狂的资本
2楼-- · 2019-01-06 09:57

You can use the library stringr.

library(tidyverse) #For piping 
library(stringr) #Note: it's part of "tidyverse"

  c("1", "2", "X") %>%
    stringr::str_extract_all("\\(?[0-9,.]+\\)?") %>% 
    as.numeric()
查看更多
Ridiculous、
3楼-- · 2019-01-06 10:00

In general suppressing warnings is not the best solution as you may want to be warned when some unexpected input will be provided.
Solution below is wrapper for maintaining just NA during data type conversion. Doesn't require any package.

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
查看更多
Explosion°爆炸
4楼-- · 2019-01-06 10:03

Use suppressWarnings():

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

This suppresses warnings.

查看更多
来,给爷笑一个
5楼-- · 2019-01-06 10:16

suppressWarnings() has already been mentioned. An alternative is to manually convert the problematic characters to NA first. For your particular problem, taRifx::destring does just that. This way if you get some other, unexpected warning out of your function, it won't be suppressed.

> 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
查看更多
登录 后发表回答