How to avoid warning when introducing NAs by coercion

260,434

Solution 1

Use suppressWarnings():

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

This suppresses warnings.

Solution 2

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

Solution 3

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

Solution 4

I have slightly modified the jangorecki function for the case where we may have a variety of values that cannot be converted to a number. In my function, a template search is performed and if the template is not found, FALSE is returned.! before gperl, it means that we need those vector elements that do not match the template. The rest is similar to the as.num function. Example:

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
Share:
260,434
Corvus
Author by

Corvus

Updated on July 09, 2022

Comments

  • Corvus
    Corvus almost 2 years

    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?

  • keberwein
    keberwein over 6 years
    This is the best answer. Using suppressWarnings() is generally a bad idea, because we sometimes need to see those warnings.
  • Hong
    Hong about 4 years
    I know this is an old thread and destring works perfectly for op's example, but one caveat for anyone who sees this thread in the future is that destring works differently from as.numeric when the target string is a mixture of string and numeric : that is, destring("x1") gives 1 but as.numeric("x1") gives NA
  • Ian
    Ian almost 4 years
    Although this is the preferred response, the answer by jangorecki below seems, to me, more solid.
  • ckx
    ckx almost 2 years
    The example will not run presently because pattern has not been specified. as.num.pattern(c('1', '2', '3.43', NA, 'char1', 'test2', 'other3', '23/40', '23, 54 cm.'),pattern = "^[0-9\\.,]+$") will reproduce the results.
  • Urasquirrel
    Urasquirrel almost 2 years
    Error in library(taRifx): there is no package called ‘taRifx’ There is only Zuul. knowyourmeme.com/memes/there-is-no-dana-only-zuul