Generalmente prefiero a código R por lo que yo no entiendo, advertencias, pero no sé cómo evitar recibir una advertencia cuando se utiliza as.numeric para convertir un carácter de vector.

Por ejemplo:

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

Me dará una advertencia ya que introdujo NAs mediante la coerción. Quiero NAs introducido por la coacción – ¿hay una manera de decir «sí, esto es lo que yo quiero hacer». O debo vivir con la advertencia?

O debo utilizar una función diferente para esta tarea?

  • Ver ?suppressWarnings tal vez?
  • ¿Cuál es el problema con esta advertencia? Generalmente se da información valiosa. Yo prefiero más detallado de salida en el R de la consola a sorpresas desagradables.
  • Estoy totalmente de acuerdo, pero la utilidad de las advertencias disminuye si se acostumbre a hacer caso omiso de ellas. Es por eso que en general me gusta «abordar» las advertencias. En este caso, que SIEMPRE va a generar advertencias, y muchos de ellos – mis datos en forma de cadenas con «X» representa NA, y por lo que la función está haciendo exactamente lo que yo quiero hacer. Yo quería que dice «Gracias por dejarme saber, pero no importa yo sé lo que estoy haciendo». suppressWarnings parece perfecto.
  • Usted sabe que read.table acepta un argumento na.strings?
  • Es útil para suprimir si usted ya tiene un trabajo en torno a un error conocido en una biblioteca. Eso es lo que yo voy a usar esto!
InformationsquelleAutor Corone | 2013-02-20

4 Comentarios

  1. 123

    Uso suppressWarnings():

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

    Esto suprime advertencias.

  2. 31

    suppressWarnings() ya ha sido mencionado. Una alternativa es convertir manualmente los caracteres problemáticos a NA primera. Para su problema en particular, taRifx::destring hace justamente eso. De esta manera si usted consigue algunos otros, advertencia inesperada de su función, no será suprimida.

    > 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
    • Sólo un breve comentario – he utilizado este por entibaciones la destring función de raRifx y la definición de que es mi propia función (como sucede, dentro de otra función), lo que me permitió palo a base de R @Ari
    • Totalmente de fiar. Usted puede encontrar la función aquí: github.com/gsk3/taRifx/blob/master/R/Rfunctions.R#L1161
    • gracias. Hice referencia taRifx y destring en la función que yo, pero dudo que va a ser publicado…
    • No se preocupa de crédito; sólo quería que los demás sean capaces de encontrar y hacer la misma cosa.
    • Pensé que iba a ser un poco malos modales de no reconocer el origen del código, especialmente cuando es tan útil.
    • Sería normalmente, pero tienen mi bendición. Gracias por ser tan considerado.

  3. 15

    En general, la supresión de las advertencias de que no es la mejor solución, ya que es posible que desee ser avisado en pantalla de la inesperada entrada será proporcionado.

    Solución a continuación se contenedor para el mantenimiento de NA durante la conversión de 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
    • Esta es la mejor respuesta. El uso de suppressWarnings() es generalmente una mala idea, porque a veces necesitamos ver esas advertencias.
  4. 1

    Tuve el mismo problema con un marco de datos de la columna quería utilizar para el eje y de un ggplot2 diagrama de dispersión, pero aquí es cómo he resuelto:

    as.numeric(as.factor(columnName))

    Puede resultar también de utilidad en lugar de utilizar suppressWarnings()

    • No creo que esto le da la respuesta deseada. Por ejemplo, as.numeric(as.factor(c(5, 6, "cat", "dog"))) devuelve c(1, 2, 3, 4), mientras que la respuesta deseada es c(5, 6, NA, NA).

Dejar respuesta

Please enter your comment!
Please enter your name here