visualizar mtcars español empty ejemplos data create crear column r dataframe

español - r data frame mtcars



Convierta todas las columnas de caracteres del marco de datos a factores (5)

Dado un marco de datos (preexistente) que tiene columnas de varios tipos, ¿cuál es la forma más sencilla de convertir todas sus columnas de caracteres en factores, sin afectar a las columnas de otros tipos?

Aquí hay un ejemplo data.frame :

df <- data.frame(A = factor(LETTERS[1:5]), B = 1:5, C = as.logical(c(1, 1, 0, 0, 1)), D = letters[1:5], E = paste(LETTERS[1:5], letters[1:5]), stringsAsFactors = FALSE) df # A B C D E # 1 A 1 TRUE a A a # 2 B 2 TRUE b B b # 3 C 3 FALSE c C c # 4 D 4 FALSE d D d # 5 E 5 TRUE e E e str(df) # ''data.frame'': 5 obs. of 5 variables: # $ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5 # $ B: int 1 2 3 4 5 # $ C: logi TRUE TRUE FALSE FALSE TRUE # $ D: chr "a" "b" "c" "d" ... # $ E: chr "A a" "B b" "C c" "D d" ...

Sé que puedo hacer:

df$D <- as.factor(df$D) df$E <- as.factor(df$E)

¿Hay alguna forma de automatizar este proceso un poco más?


Como @Raf Z comentó sobre esta question , dplyr ahora tiene mutate_if. Súper útil, simple y legible.

> str(df) ''data.frame'': 5 obs. of 5 variables: $ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5 $ B: int 1 2 3 4 5 $ C: logi TRUE TRUE FALSE FALSE TRUE $ D: chr "a" "b" "c" "d" ... $ E: chr "A a" "B b" "C c" "D d" ... > df <- df %>% mutate_if(is.character,as.factor) > str(df) ''data.frame'': 5 obs. of 5 variables: $ A: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5 $ B: int 1 2 3 4 5 $ C: logi TRUE TRUE FALSE FALSE TRUE $ D: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 $ E: Factor w/ 5 levels "A a","B b","C c",..: 1 2 3 4 5


La forma más fácil sería usar el código que se proporciona a continuación. Automatizaría todo el proceso de conversión de todas las variables como factores en un marco de datos en R. funcionó perfectamente bien para mí. food_cat aquí está el conjunto de datos que estoy usando. Cámbielo a aquel en el que está trabajando.

for(i in 1:ncol(food_cat)){ food_cat[,i] <- as.factor(food_cat[,i]) }


La respuesta de Roland es excelente para este problema específico, pero pensé que compartiría un enfoque más general.

DF <- data.frame(x = letters[1:5], y = 1:5, z = LETTERS[1:5], stringsAsFactors=FALSE) str(DF) # ''data.frame'': 5 obs. of 3 variables: # $ x: chr "a" "b" "c" "d" ... # $ y: int 1 2 3 4 5 # $ z: chr "A" "B" "C" "D" ... ## The conversion DF[sapply(DF, is.character)] <- lapply(DF[sapply(DF, is.character)], as.factor) str(DF) # ''data.frame'': 5 obs. of 3 variables: # $ x: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 # $ y: int 1 2 3 4 5 # $ z: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5

Para la conversión, el lado izquierdo de la asignación ( DF[sapply(DF, is.character)] ) subconjuntos las columnas que son carácter. En el lado derecho, para ese subconjunto, utiliza lapply para realizar cualquier conversión que necesite hacer. R es lo suficientemente inteligente como para reemplazar las columnas originales con los resultados.

Lo útil de esto es si quieres ir por el otro lado o hacer otras conversiones, es tan simple como cambiar lo que estás buscando a la izquierda y especificar a qué quieres cambiarlo a la derecha.


Solía ​​hacer un simple bucle. Como respuesta a @ A5C1D2H2I1M1N2O1R2T1, lapply es una buena solución. Pero si convierte todas las columnas, necesitará un data.frame antes, de lo contrario terminará con una list . Pocas diferencias de tiempo de ejecución.

mm2N=mm2New[,10:18] str(mm2N) ''data.frame'': 35487 obs. of 9 variables: $ bb : int 4 6 2 3 3 2 5 2 1 2 ... $ vabb : int -3 -3 -2 -2 -3 -1 0 0 3 3 ... $ bb55 : int 7 6 3 4 4 4 9 2 5 4 ... $ vabb55: int -3 -1 0 -1 -2 -2 -3 0 -1 3 ... $ zr : num 0 -2 -1 1 -1 -1 -1 1 1 0 ... $ z55r : num -2 -2 0 1 -2 -2 -2 1 -1 1 ... $ fechar: num 0 -1 1 0 1 1 0 0 1 0 ... $ varr : num 3 3 1 1 1 1 4 1 1 3 ... $ minmax: int 3 0 4 6 6 6 0 6 6 1 ... # For solution t1=Sys.time() for(i in 1:ncol(mm2N)) mm2N[,i]=as.factor(mm2N[,i]) Sys.time()-t1 Time difference of 0.2020121 secs str(mm2N) ''data.frame'': 35487 obs. of 9 variables: $ bb : Factor w/ 6 levels "1","2","3","4",..: 4 6 2 3 3 2 5 2 1 2 ... $ vabb : Factor w/ 7 levels "-3","-2","-1",..: 1 1 2 2 1 3 4 4 7 7 ... $ bb55 : Factor w/ 8 levels "2","3","4","5",..: 6 5 2 3 3 3 8 1 4 3 ... $ vabb55: Factor w/ 7 levels "-3","-2","-1",..: 1 3 4 3 2 2 1 4 3 7 ... $ zr : Factor w/ 5 levels "-2","-1","0",..: 3 1 2 4 2 2 2 4 4 3 ... $ z55r : Factor w/ 5 levels "-2","-1","0",..: 1 1 3 4 1 1 1 4 2 4 ... $ fechar: Factor w/ 3 levels "-1","0","1": 2 1 3 2 3 3 2 2 3 2 ... $ varr : Factor w/ 5 levels "1","2","3","4",..: 3 3 1 1 1 1 4 1 1 3 ... $ minmax: Factor w/ 7 levels "0","1","2","3",..: 4 1 5 7 7 7 1 7 7 2 ... #lapply solution mm2N=mm2New[,10:18] t1=Sys.time() mm2N <- lapply(mm2N, as.factor) Sys.time()-t1 Time difference of 0.209012 secs str(mm2N) List of 9 $ bb : Factor w/ 6 levels "1","2","3","4",..: 4 6 2 3 3 2 5 2 1 2 ... $ vabb : Factor w/ 7 levels "-3","-2","-1",..: 1 1 2 2 1 3 4 4 7 7 ... $ bb55 : Factor w/ 8 levels "2","3","4","5",..: 6 5 2 3 3 3 8 1 4 3 ... $ vabb55: Factor w/ 7 levels "-3","-2","-1",..: 1 3 4 3 2 2 1 4 3 7 ... $ zr : Factor w/ 5 levels "-2","-1","0",..: 3 1 2 4 2 2 2 4 4 3 ... $ z55r : Factor w/ 5 levels "-2","-1","0",..: 1 1 3 4 1 1 1 4 2 4 ... $ fechar: Factor w/ 3 levels "-1","0","1": 2 1 3 2 3 3 2 2 3 2 ... $ varr : Factor w/ 5 levels "1","2","3","4",..: 3 3 1 1 1 1 4 1 1 3 ... $ minmax: Factor w/ 7 levels "0","1","2","3",..: 4 1 5 7 7 7 1 7 7 2 ... #data.frame lapply solution mm2N=mm2New[,10:18] t1=Sys.time() mm2N <- data.frame(lapply(mm2N, as.factor)) Sys.time()-t1 Time difference of 0.2010119 secs str(mm2N) ''data.frame'': 35487 obs. of 9 variables: $ bb : Factor w/ 6 levels "1","2","3","4",..: 4 6 2 3 3 2 5 2 1 2 ... $ vabb : Factor w/ 7 levels "-3","-2","-1",..: 1 1 2 2 1 3 4 4 7 7 ... $ bb55 : Factor w/ 8 levels "2","3","4","5",..: 6 5 2 3 3 3 8 1 4 3 ... $ vabb55: Factor w/ 7 levels "-3","-2","-1",..: 1 3 4 3 2 2 1 4 3 7 ... $ zr : Factor w/ 5 levels "-2","-1","0",..: 3 1 2 4 2 2 2 4 4 3 ... $ z55r : Factor w/ 5 levels "-2","-1","0",..: 1 1 3 4 1 1 1 4 2 4 ... $ fechar: Factor w/ 3 levels "-1","0","1": 2 1 3 2 3 3 2 2 3 2 ... $ varr : Factor w/ 5 levels "1","2","3","4",..: 3 3 1 1 1 1 4 1 1 3 ... $ minmax: Factor w/ 7 levels "0","1","2","3",..: 4 1 5 7 7 7 1 7 7 2 ...


DF <- data.frame(x=letters[1:5], y=1:5, stringsAsFactors=FALSE) str(DF) #''data.frame'': 5 obs. of 2 variables: # $ x: chr "a" "b" "c" "d" ... # $ y: int 1 2 3 4 5

El valor predeterminado (molesto) de as.data.frame es convertir todas las columnas de caracteres en columnas de factores. Puedes usar eso aquí:

DF <- as.data.frame(unclass(DF)) str(DF) #''data.frame'': 5 obs. of 2 variables: # $ x: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 # $ y: int 1 2 3 4 5