enumerar todos los niveles de factores de un data.frame

Resuelto ckluss asked hace 54 años • 8 respuestas

con str(data)obtengo los headde los niveles (1-2 valores)

fac1: Factor w/ 2  levels ... :
fac2: Factor w/ 5  levels ... :
fac3: Factor w/ 20 levels ... :
val: num ...

Con dplyr::glimpse(data)obtengo más valores, pero no hay información sobre el número/valores de los niveles de factores. ¿Existe una forma automática de obtener toda la información de nivel de todas las variables de factor en un marco de datos? Un breve formulario con más información para

levels(data$fac1)
levels(data$fac2)
levels(data$fac3)

o más precisamente una versión elegante para algo como

for (n in names(data))
  if (is.factor(data[[n]])) {
    print(n)
    print(levels(data[[n]]))
  }

gracias Christof

ckluss avatar Jan 01 '70 08:01 ckluss
Aceptado

Aquí hay algunas opciones. Recorremos los 'datos' sapplyy obtenemos el levelsde cada columna (asumiendo que todas las columnas son factorde clase)

sapply(data, levels)

O si necesitamos canalizarlo ( %>%), esto se puede hacer como

library(dplyr)
data %>% 
     sapply(levels)

U otra opción es summarise_eachdesde dplyrdonde especificamos el levelsdentro del funs.

 data %>%
      summarise_each(funs(list(levels(.))))
akrun avatar Dec 28 '2014 13:12 akrun

Si su problema es específicamente generar una lista de todos los niveles para un factor, entonces encontré una solución simple usando:

único(df$x)

Por ejemplo, para el infame conjunto de datos del iris:

único(iris$Especie)

Djamil Lakhdar-Hamina avatar Dec 07 '2018 21:12 Djamil Lakhdar-Hamina

O usando ronroneo:

data %>% purrr::map(levels)

O primero factorizar todo:

data %>% dplyr::mutate_all(as.factor) %>% purrr::map(levels)

Y respondiendo a la pregunta sobre cómo obtener las longitudes:

data %>% map(levels) %>% map(length)
Amit Kohli avatar Mar 16 '2018 11:03 Amit Kohli