¿Cómo convertir una columna de marco de datos a tipo numérico?

Resuelto acroa asked hace 54 años • 18 respuestas

¿Cómo se convierte una columna de marco de datos a un tipo numérico?

acroa avatar Jan 01 '70 08:01 acroa
Aceptado

Dado que (todavía) nadie tiene la marca de verificación, supongo que tiene algún problema práctico en mente, principalmente porque no ha especificado a qué tipo de vector desea convertir numeric. Le sugiero que aplique transformla función para completar su tarea.

Ahora estoy a punto de demostrar cierta "anomalía de conversión":

# create dummy data.frame
d <- data.frame(char = letters[1:5], 
                fake_char = as.character(1:5), 
                fac = factor(1:5), 
                char_fac = factor(letters[1:5]), 
                num = 1:5, stringsAsFactors = FALSE)

Echemos un vistazo adata.frame

> d
  char fake_char fac char_fac num
1    a         1   1        a   1
2    b         2   2        b   2
3    c         3   3        c   3
4    d         4   4        d   4
5    e         5   5        e   5

y ejecutemos:

> sapply(d, mode)
       char   fake_char         fac    char_fac         num 
"character" "character"   "numeric"   "numeric"   "numeric" 
> sapply(d, class)
       char   fake_char         fac    char_fac         num 
"character" "character"    "factor"    "factor"   "integer" 

Ahora probablemente te preguntes "¿Dónde hay una anomalía?" Bueno, me he topado con cosas bastante peculiares en R, y esto no es lo más confuso, pero puede confundirte, especialmente si lees esto antes de irte a la cama.

Aquí va: las dos primeras columnas son character. He llamado deliberadamente al segundofake_char . Encuentra la similitud de esta charactervariable con una que Dirk creó en su respuesta. En realidad, es un numericalvector convertido a character. La tercera y cuarta columna son factor, y la última es "puramente" numeric.

Si utiliza transformla función, puede convertir la variable fake_charen numeric, pero no la charvariable en sí.

> transform(d, char = as.numeric(char))
  char fake_char fac char_fac num
1   NA         1   1        a   1
2   NA         2   2        b   2
3   NA         3   3        c   3
4   NA         4   4        d   4
5   NA         5   5        e   5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion

pero si haces lo mismo en fake_chary char_fac, tendrás suerte y no tendrás NA:

> transform(d, fake_char = as.numeric(fake_char), 
               char_fac = as.numeric(char_fac))

  char fake_char fac char_fac num
1    a         1   1        1   1
2    b         2   2        2   2
3    c         3   3        3   3
4    d         4   4        4   4
5    e         5   5        5   5

Si guarda transformado data.framey busca modey class, obtendrá:

> D <- transform(d, fake_char = as.numeric(fake_char), 
                    char_fac = as.numeric(char_fac))

> sapply(D, mode)
       char   fake_char         fac    char_fac         num 
"character"   "numeric"   "numeric"   "numeric"   "numeric" 
> sapply(D, class)
       char   fake_char         fac    char_fac         num 
"character"   "numeric"    "factor"   "numeric"   "integer"

Entonces, la conclusión es: Sí, puedes convertir characterun vector en numericuno, pero solo si sus elementos son "convertibles" en numeric. Si solo hay un characterelemento en el vector, obtendrás un error al intentar convertir ese vector en numericaluno.

Y sólo para demostrar mi punto:

> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion 
> char
[1]  1 NA  3  4 NA

Y ahora, sólo por diversión (o práctica), intenta adivinar el resultado de estos comandos:

> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???

¡Saludos cordiales a Patrick Burns! =)

aL3xa avatar Feb 19 '2010 00:02 aL3xa

Algo que me ha ayudado: si tienes rangos de variables para convertir (o simplemente más de una), puedes usar sapply.

Un poco absurdo pero sólo por ejemplo:

data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)

Digamos que las columnas 3, 6-15 y 37 de su marco de datos deben convertirse a números. Uno podría:

dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)
Jay avatar Feb 18 '2010 16:02 Jay

si xes el nombre de la columna de dataframe daty xes de tipo factor, use:

as.numeric(as.character(dat$x))
 avatar Feb 18 '2010 12:02

Habría agregado un comentario (no puedo tener una calificación baja)

Solo para agregar user276042 y pangratz

dat$x = as.numeric(as.character(dat$x))

Esto anulará los valores de la columna x existente.

Somum avatar Dec 06 '2014 05:12 Somum