varias variable superponer studio numericas numerica graficos graficas factor convertir categoricas r

variable - superponer graficas en r



Cambiar la clase de numérico a factor de muchas columnas en un marco de datos (10)

Además de la respuesta de Ramnath, el comportamiento que estás experimentando es el debido a que as.numeric(x) devuelve la representación numérica interna del factor x en el nivel R. Si desea conservar los números que son los niveles del factor (en lugar de su representación interna), primero debe convertir a carácter a través de as.character() según el ejemplo de Ramnath.

Su bucle for es tan razonable como una llamada de apply y podría ser un poco más legible en cuanto a cuál es la intención del código. Solo cambia esta línea:

stats[,i] <- as.numeric(stats[,i])

leer

stats[,i] <- as.numeric(as.character(stats[,i]))

Esta es la pregunta frecuente 7.10 en las preguntas frecuentes de R.

HTH

¿Cuál es la forma más rápida / mejor de cambiar una gran cantidad de columnas a numéricas de factor?

Utilicé el siguiente código pero parece que reordenó mis datos.

> head(stats[,1:2]) rk team 1 1 Washington Capitals* 2 2 San Jose Sharks* 3 3 Chicago Blackhawks* 4 4 Phoenix Coyotes* 5 5 New Jersey Devils* 6 6 Vancouver Canucks* for(i in c(1,3:ncol(stats))) { stats[,i] <- as.numeric(stats[,i]) } > head(stats[,1:2]) rk team 1 2 Washington Capitals* 2 13 San Jose Sharks* 3 24 Chicago Blackhawks* 4 26 Phoenix Coyotes* 5 27 New Jersey Devils* 6 28 Vancouver Canucks*

¿Cuál es la mejor manera, sin nombrar todas las columnas como en:

df$colname <- as.numeric(ds$colname)


Creo que ucfagls descubrió por qué tu bucle no funciona.

En caso de que todavía no desee utilizar un bucle aquí, hay una solución con lapply :

factorToNumeric <- function(f) as.numeric(levels(f))[as.integer(f)] cols <- c(1, 3:ncol(stats)) stats[cols] <- lapply(stats[cols], factorToNumeric)

Editar. Encontré una solución más simple. Parece que as.matrix convierte en personaje. Asi que

stats[cols] <- as.numeric(as.matrix(stats[cols]))

debería hacer lo que quieras


Debe tener cuidado al cambiar los factores a numéricos. Aquí hay una línea de código que cambiaría un conjunto de columnas de factor a numérico. Supongo que las columnas que se cambiarán a numéricas son 1, 3, 4 y 5, respectivamente. Usted podría cambiarlo en consecuencia

cols = c(1, 3, 4, 5); df[,cols] = apply(df[,cols], 2, function(x) as.numeric(as.character(x)));


Encontré esta función en otros dos hilos duplicados y encontré que es una manera elegante y general de resolver este problema. Este hilo aparece primero en la mayoría de las búsquedas sobre este tema, así que lo estoy compartiendo aquí para ahorrarle tiempo a la gente. No me atribuyo ningún mérito por esto, solo mire las publicaciones originales here y here para más detalles.

df <- data.frame(x = 1:10, y = rep(1:2, 5), k = rnorm(10, 5,2), z = rep(c(2010, 2012, 2011, 2010, 1999), 2), j = c(rep(c("a", "b", "c"), 3), "d")) convert.magic <- function(obj, type){ FUN1 <- switch(type, character = as.character, numeric = as.numeric, factor = as.factor) out <- lapply(obj, FUN1) as.data.frame(out) } str(df) str(convert.magic(df, "character")) str(convert.magic(df, "factor")) df[, c("x", "y")] <- convert.magic(df[, c("x", "y")], "factor")


Eso es lo que funcionó para mí. La función apply() intenta forzar df a la matriz y devuelve NA.

numeric.df <- as.data.frame(sapply(df, 2, as.numeric))


Esto se puede hacer en una línea, no hay necesidad de un bucle, ya sea un bucle for o una aplicación. Use unlist () en su lugar:

# testdata Df <- data.frame( x = as.factor(sample(1:5,30,r=TRUE)), y = as.factor(sample(1:5,30,r=TRUE)), z = as.factor(sample(1:5,30,r=TRUE)), w = as.factor(sample(1:5,30,r=TRUE)) ) ## Df[,c("y","w")] <- as.numeric(as.character(unlist(Df[,c("y","w")]))) str(Df)

Editar: para su código, esto se convierte en:

id <- c(1,3:ncol(stats))) stats[,id] <- as.numeric(as.character(unlist(stats[,id])))

Obviamente, si tiene un marco de datos de una columna y no desea que la reducción de dimensión automática de R lo convierta en un vector, tendrá que agregar el argumento drop=FALSE .


Lapply está más o menos diseñado para esto

unfactorize<-c("colA","colB") df[,unfactorize]<-lapply(unfactorize, function(x) as.numeric(as.character(df[,x])))


Me gustaría señalar que si tienes NA en cualquier columna, simplemente usar subíndices no funcionará. Si hay NA en el factor, debe usar el script de aplicación provisto por Ramnath.

P.ej

Df <- data.frame( x = c(NA,as.factor(sample(1:5,30,r=T))), y = c(NA,as.factor(sample(1:5,30,r=T))), z = c(NA,as.factor(sample(1:5,30,r=T))), w = c(NA,as.factor(sample(1:5,30,r=T))) ) Df[,c(1:4)] <- as.numeric(as.character(Df[,c(1:4)]))

Devuelve lo siguiente:

Warning message: NAs introduced by coercion > head(Df) x y z w 1 NA NA NA NA 2 NA NA NA NA 3 NA NA NA NA 4 NA NA NA NA 5 NA NA NA NA 6 NA NA NA NA

Pero:

Df[,c(1:4)]= apply(Df[,c(1:4)], 2, function(x) as.numeric(as.character(x)))

Devoluciones:

> head(Df) x y z w 1 NA NA NA NA 2 2 3 4 1 3 1 5 3 4 4 2 3 4 1 5 5 3 5 5 6 4 2 4 4


Sé que esta pregunta se resolvió por mucho tiempo, pero recientemente tuve un problema similar y creo que encontré una solución un poco más elegante y funcional, aunque requiere el paquete magrittr.

library(magrittr) cols = c(1, 3, 4, 5) df[,cols] %<>% lapply(function(x) as.numeric(as.character(x)))

El %<>% canalizaciones y reasignaciones de operadores, lo cual es muy útil para mantener la limpieza y transformación de los datos simple. Ahora la función de aplicar lista es mucho más fácil de leer, solo especificando la función que desea aplicar.


Tuve problemas para convertir todas las columnas en numéricas con una llamada a apply() :

apply(data, 2, as.numeric)

El problema se debe a que algunas de las cadenas tienen una coma, por ejemplo, "1,024.63" en lugar de "1024.63", y a R no le gusta esta forma de formatear los números. Así que los as.numeric() y luego corrí as.numeric() :

data = as.data.frame(apply(data, 2, function(x) { y = str_replace_all(x, ",", "") #remove commas return(as.numeric(y)) #then convert }))

Tenga en cuenta que esto requiere que se cargue el paquete stringr.