Cómo evitar advertencias al introducir NA por coerción

124

Generalmente prefiero codificar R para no recibir advertencias, pero no sé cómo evitar recibir una advertencia cuando uso as.numericpara convertir un vector de caracteres.

Por ejemplo:

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

Me dará una advertencia porque introdujo NA por coerción. Quiero NA introducidas por coerción: ¿hay alguna manera de decirle "sí, esto es lo que quiero hacer". ¿O debería vivir con la advertencia?

¿O debería estar usando una función diferente para esta tarea?

Korone
fuente
8
¿Ves ?suppressWarningstal vez?
A5C1D2H2I1M1N2O1R2T1
44
¿Cuál es el problema con esta advertencia? Generalmente da información valiosa. Prefiero una salida más detallada en la consola R a sorpresas desagradables.
Roland
12
@Roland Estoy totalmente de acuerdo, pero la utilidad de las advertencias disminuye si te acostumbras a ignorarlas. Es por eso que generalmente me gusta "abordar" las advertencias. En este caso, SIEMPRE generaré advertencias, y muchas de ellas: mis datos entran como cadenas con "X" que representa NA, por lo que la función está haciendo exactamente lo que quiero que haga. Quería decir "Gracias por avisarme, pero está bien, sé lo que estoy haciendo". suppressWarningsParece perfecto
Korone
66
¿Sabes que read.tableacepta una discusión na.strings?
Roland
Es útil suprimirlos si ya tiene una solución a un error conocido en una biblioteca. ¡Así es como voy a usar esto!
Clem Wang

Respuestas:

142

Uso suppressWarnings():

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

Esto suprime las advertencias.

Andrie
fuente
Aunque esta es la respuesta preferida, la respuesta de jangorecki a continuación me parece más sólida.
Ian
34

suppressWarnings()Ya ha sido mencionado. Una alternativa es convertir manualmente los caracteres problemáticos a NA primero. Para su problema particular, taRifx::destringhace exactamente eso. De esta manera, si obtiene alguna otra advertencia inesperada de su función, no se suprimirá.

> 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
Ari B. Friedman
fuente
3
Sé que este es un hilo antiguo y destringfunciona perfectamente para el ejemplo de op, pero una advertencia para cualquiera que vea este hilo en el futuro es que destringfunciona de manera diferente a as.numericcuando la cadena objetivo es una mezcla de cadena y numérica: es decir, destring("x1")da 1pero as.numeric("x1")daNA
Hong
26

En general, la supresión de advertencias no es la mejor solución, ya que es posible que desee recibir una advertencia cuando se proporcione alguna entrada inesperada.
La solución a continuación es un contenedor para mantener solo NA durante la conversión del tipo de datos. No requiere ningún paquete.

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
jangorecki
fuente
44
Esta es la mejor respuesta. Usar suppressWarnings()es generalmente una mala idea, porque a veces necesitamos ver esas advertencias.
keberwein
0

He modificado ligeramente la función jangorecki para el caso en el que podemos tener una variedad de valores que no se pueden convertir a un número. En mi función, se realiza una búsqueda de plantilla y, si no se encuentra la plantilla, se devuelve FALSE. antes de gperl, significa que necesitamos esos elementos vectoriales que no coinciden con la plantilla. El resto es similar a la as.numfunción. Ejemplo:

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
Vladislav Shufinskiy
fuente