sirve recodificar que para factores factor etiquetar r dataframe r-factor

que - recodificar variables en r



Coaccionar mĂșltiples columnas a factores a la vez (7)

Aquí hay un ejemplo de data.table . grep en este ejemplo porque a menudo selecciono muchas columnas usando coincidencias parciales con sus nombres.

library(data.table) data <- data.table(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10]))) factorCols <- grep(pattern = "A|C|D|H", x = names(data), value = TRUE) data[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]

Tengo un marco de datos de muestra como el siguiente:

data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10])))

Quiero saber cómo puedo seleccionar varias columnas y convertirlas juntas en factores. Por lo general, lo hago de la misma manera que los data$A = as.factor(data$A) . Pero cuando el marco de datos es muy grande y contiene muchas columnas, esta forma requerirá mucho tiempo. ¿Alguien sabe de una mejor manera de hacerlo?


Aquí hay una opción usando dplyr . El operador %<>% de magrittr actualiza el objeto magrittr con el valor resultante.

library(magrittr) library(dplyr) cols <- c("A", "C", "D", "H") data %<>% mutate_each_(funs(factor(.)),cols) str(data) #''data.frame'': 4 obs. of 10 variables: # $ A: Factor w/ 4 levels "23","24","26",..: 1 2 3 4 # $ B: int 15 13 39 16 # $ C: Factor w/ 4 levels "3","5","18","37": 2 1 3 4 # $ D: Factor w/ 4 levels "2","6","28","38": 3 1 4 2 # $ E: int 14 4 22 20 # $ F: int 7 19 36 27 # $ G: int 35 40 21 10 # $ H: Factor w/ 4 levels "11","29","32",..: 1 4 3 2 # $ I: int 17 1 9 25 # $ J: int 12 30 8 33

O si estamos usando data.table , use un bucle for con set

setDT(data) for(j in cols){ set(data, i=NULL, j=j, value=factor(data[[j]])) }

O podemos especificar los ''cols'' en .SDcols y asignar ( := ) los rhs a ''cols''

setDT(data)[, (cols):= lapply(.SD, factor), .SDcols=cols]


Elija algunas columnas para obligar a los factores:

cols <- c("A", "C", "D", "H")

Use lapply() para forzar y reemplazar las columnas elegidas:

data[cols] <- lapply(data[cols], factor) ## as.factor() could also be used

Comprueba el resultado:

sapply(data, class) # A B C D E F G # "factor" "integer" "factor" "factor" "integer" "integer" "integer" # H I J # "factor" "integer" "integer"


La forma tidyverse más reciente es usar la función mutate_at :

library(tidyverse) library(magrittr) set.seed(88) data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10]))) cols <- c("A", "C", "D", "H") data %<>% mutate_at(cols, funs(factor(.))) str(data) $ A: Factor w/ 4 levels "5","17","18",..: 2 1 4 3 $ B: int 36 35 2 26 $ C: Factor w/ 4 levels "22","31","32",..: 1 2 4 3 $ D: Factor w/ 4 levels "1","9","16","39": 3 4 1 2 $ E: int 3 14 30 38 $ F: int 27 15 28 37 $ G: int 19 11 6 21 $ H: Factor w/ 4 levels "7","12","20",..: 1 3 4 2 $ I: int 23 24 13 8 $ J: int 10 25 4 33


Puede usar mutate_if ( dplyr ):

Por ejemplo, coerce integer en factor :

mydata=structure(list(a = 1:10, b = 1:10, c = c("a", "a", "b", "b", "c", "c", "c", "c", "c", "c")), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame")) # A tibble: 10 x 3 a b c <int> <int> <chr> 1 1 1 a 2 2 2 a 3 3 3 b 4 4 4 b 5 5 5 c 6 6 6 c 7 7 7 c 8 8 8 c 9 9 9 c 10 10 10 c

Usa la función:

library(dplyr) mydata%>% mutate_if(is.integer,as.factor) # A tibble: 10 x 3 a b c <fct> <fct> <chr> 1 1 1 a 2 2 2 a 3 3 3 b 4 4 4 b 5 5 5 c 6 6 6 c 7 7 7 c 8 8 8 c 9 9 9 c 10 10 10 c


Si tiene otro objetivo de obtener valores de la tabla y luego usarlos para convertirlos, puede intentar de la siguiente manera

### pre processing ind <- bigm.train[,lapply(.SD,is.character)] ind <- names(ind[,.SD[T]]) ### Convert multiple columns to factor bigm.train[,(ind):=lapply(.SD,factor),.SDcols=ind]

Esto selecciona columnas que están específicamente basadas en caracteres y luego las convierte en factor.


y, para completar y con respecto a esta pregunta sobre el cambio de columnas de cadena solamente , hay mutate_if :

data <- cbind(stringVar = sample(c("foo","bar"),10,replace=TRUE), data.frame(matrix(sample(1:40), 10, 10, dimnames = list(1:10, LETTERS[1:10]))),stringsAsFactors=FALSE) factoredData = data %>% mutate_if(is.character,funs(factor(.)))