¿Cómo se convierte una columna de marco de datos a un tipo numérico?
fuente
¿Cómo se convierte una columna de marco de datos a un tipo numérico?
Dado que (todavía) nadie obtuvo una 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 la transform
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 a data.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 vamos a correr:
> 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 preguntas "¿Dónde hay una anomalía?" Bueno, he encontré con cosas muy peculiares en R, y esto no es la cosa más confusión, si bien se puede confundir, especialmente si lee esto antes de rodar en la cama.
Aquí va: las dos primeras columnas son character
. He llamado deliberadamente 2 nd uno fake_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
. 3 rd y 4 º columna son factor
, y el último es "puramente" numeric
.
Si utiliza la transform
función, puede convertirla fake_char
en numeric
, pero no en la char
variable misma.
> 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 fake_char
y char_fac
tendrás suerte, y saldrás sin 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í, puede convertir un character
vector en numeric
uno, pero solo si sus elementos son "convertibles" numeric
. Si solo hay un character
elemento en el vector, obtendrá un error al intentar convertir ese vector en numerical
uno.
Y solo para probar 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, solo por diversión (o práctica), intente 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 tiene rangos de variables para convertir (o solo más de uno), puede usar
sapply
.Un poco absurdo pero solo por ejemplo:
Supongamos que las columnas 3, 6-15 y 37 de su marco de datos deben convertirse a una numérica que podría:
fuente
sapply
llamada enas.data.frame()
el lado derecho, como @Mehrad Mahmoudian sugirió a continuación, funcionará.si
x
es el nombre de columna del marco de datosdat
yx
es de tipo factor, use:fuente
as.character
hecho es lo que estaba buscando. De lo contrario, la conversión a veces sale mal. Al menos en mi caso.Error: (list) object cannot be coerced to type 'double'
aunque estaba razonablemente seguro de que mi vector no tenía caracteres / signos de puntuación. Luego lo intentéas.numeric(as.character(dat$x))
y funcionó. ¡Ahora no estoy seguro de si mi columna es de hecho solo enteros o no!Hubiera agregado un comentario (no puedo calificar bajo)
Solo para agregar en user276042 y pangratz
Esto anulará los valores de la columna x existente
fuente
Si bien su pregunta es estrictamente numérica, hay muchas conversiones que son difíciles de entender al comenzar R. Voy a tratar de abordar los métodos para ayudar. Esta pregunta es similar a esta pregunta .
La conversión de tipos puede ser una molestia en R porque (1) los factores no se pueden convertir directamente a numéricos, primero deben convertirse a la clase de caracteres, (2) las fechas son un caso especial que generalmente necesita tratar por separado, y (3) recorrer las columnas del marco de datos puede ser complicado. Afortunadamente, el "tidyverse" ha resuelto la mayoría de los problemas.
Esta solución se utiliza
mutate_each()
para aplicar una función a todas las columnas en un marco de datos. En este caso, queremos aplicar latype.convert()
función, que convierte las cadenas en numéricas donde puede. Debido a que R ama los factores (no estoy seguro de por qué), las columnas de caracteres que deben permanecer como caracteres se cambian a factor. Para solucionar esto, lamutate_if()
función se usa para detectar columnas que son factores y cambiar a caracteres. Por último, quería mostrar cómo se puede usar lubridate para cambiar una marca de tiempo en la clase de caracteres a fecha y hora porque a menudo esto también es un obstáculo para los principiantes.fuente
mutate_all(type.convert, as.is=TRUE)
lugar demutate_all(type.convert)
, puede eliminar / evitarmutate_if(is.factor, as.character)
para acortar el comando.as.is
es un argumentotype.convert()
que indica si debe convertir cadenas como caracteres o como factores. Por defecto,as.is=FALSE
entype.convert()
(es decir, convierte cadenas a la clase de factor en lugar de la clase de caracteres).Tim tiene razón y Shane tiene una omisión. Aquí hay ejemplos adicionales:
Nuestro
data.frame
ahora tiene un resumen de la columna de factores (conteos) y resúmenes numéricos deas.numeric()
--- lo cual es incorrecto ya que obtuvo los niveles de factores numéricos --- y el resumen (correcto) deas.numeric(as.character())
.fuente
Con el siguiente código, puede convertir todas las columnas del marco de datos a numérico (X es el marco de datos que queremos convertir sus columnas):
y para convertir toda la matriz en numérico, tiene dos formas: O:
o:
Alternativamente, puede usar la
data.matrix
función para convertir todo en numérico, aunque tenga en cuenta que los factores podrían no convertirse correctamente, por lo que es más seguro convertir todo acharacter
primero:Usualmente uso este último si quiero convertir a matriz y numérico simultáneamente
fuente
Si tiene problemas con:
Echa un vistazo a tus signos decimales. Si son "," en lugar de "." (por ejemplo, "5,3") lo anterior no funcionará.
Una posible solución es:
Creo que esto es bastante común en algunos países que no hablan inglés.
fuente
Manera universal usando
type.convert()
yrapply()
:fuente
as.is = TRUE
si desea convertir su personaje a numérico o factoresmatrix
de cambios numéricosclasses=matrix
erróneos a cabo primer argumento debe ser de tipo caracterPara convertir una columna de marco de datos a numérico solo tiene que hacer: -
factor a numérico: -
fuente
sapply(data_frame,function(x) as.numeric(as.character(x)))
Aunque otros han cubierto el tema bastante bien, me gustaría agregar este pensamiento rápido / pista adicional. Puede usar regexp para verificar de antemano si los caracteres pueden consistir solo en números.
Para expresiones regulares más sofisticadas y una razón clara para aprender / experimentar su poder, vea este sitio web realmente agradable: http://regexr.com/
fuente
Teniendo en cuenta que pueden existir columnas de caracteres, esto se basa en @Abdou en Obtener tipos de columnas de hoja de Excel y responde automáticamente :
fuente
En mi PC (R v.3.2.3),
apply
osapply
dar error.lapply
funciona bien.fuente
Si el marco de datos tiene varios tipos de columnas, algunos caracteres, algunos numéricos, intente lo siguiente para convertir solo las columnas que contienen valores numéricos en numéricos:
fuente
con hablar :: convertir
Para convertir fácilmente múltiples columnas a diferentes tipos de datos que puede usar
hablar::convert
. Sintaxis simple:df %>% convert(num(a))
convierte la columna a de df a numérica.Ejemplo detallado
Vamos a convertir todas las columnas de
mtcars
a carácter.Con
hablar::convert
:resultados en:
fuente
Para convertir el carácter a numérico, debe convertirlo en factor aplicando
Tienes que hacer dos columnas con los mismos datos, porque una columna no puede convertirse en numérica. Si haces una conversión, da el siguiente error
entonces, después de hacer dos columnas de los mismos datos aplican
transformará el carácter a numérico con éxito
fuente
df
Es su marco de datos.x
es una columna de ladf
que quieres convertirfuente
Si no le importa preservar los factores y desea aplicarlo a cualquier columna que se pueda convertir a numérico, utilicé el script a continuación. si df es su marco de datos original, puede usar el siguiente script.
Hice referencia a la solución de Shane y Joran por cierto
fuente