¿Cómo convertir una columna de marco de datos a tipo numérico?
¿Cómo se convierte una columna de marco de datos a un tipo numérico?
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 transform
la 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 character
variable con una que Dirk creó en su respuesta. En realidad, es un numerical
vector convertido a character
. La tercera y cuarta columna son factor
, y la última es "puramente" numeric
.
Si utiliza transform
la función, puede convertir la variable fake_char
en numeric
, pero no la char
variable 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_char
y 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.frame
y busca mode
y 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 character
un vector en numeric
uno, pero solo si sus elementos son "convertibles" en numeric
. Si solo hay un character
elemento en el vector, obtendrás un error al intentar convertir ese vector en numerical
uno.
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! =)
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)
si x
es el nombre de la columna de dataframe dat
y x
es de tipo factor, use:
as.numeric(as.character(dat$x))
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.