web-dev-qa-db-fra.com

répertorier tous les niveaux de facteurs d'un data.frame

avec str(data) j'obtiens le headdes niveaux (1-2 valeurs)

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

avec dplyr::glimpse(data) J'obtiens plus de valeurs, mais pas d'informations sur le nombre/valeurs des niveaux de facteur. Existe-t-il un moyen automatique d'obtenir toutes les informations de niveau de toutes les variables factorielles dans un data.frame? Un formulaire court avec plus d'informations pour

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

ou plus précisément une version élégante pour quelque chose comme

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

thx Christof

20
ckluss

Voici quelques options. Nous parcourons les 'données' avec sapply et obtenons le levels de chaque colonne (en supposant que toutes les colonnes sont de la classe factor)

sapply(data, levels)

Ou si nous avons besoin de pipe (%>%), cela peut être fait comme

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

Ou une autre option est summarise_each de dplyr où nous spécifions le levels dans le funs.

 data %>%
      summarise_each(funs(list(levels(.))))
22
akrun

Une méthode plus simple consiste à utiliser le package sqldf et à utiliser une instruction select distinct. Il est ainsi plus facile d'obtenir automatiquement les noms des niveaux de facteur, puis de les spécifier comme niveaux pour d'autres colonnes/variables.

L'extrait de code générique est:

library(sqldf)
    array_name = sqldf("select DISTINCT *colname1* as '*column_title*' from *table_name*")

Exemple de code utilisant le jeu de données iris:

df1 = iris
factor1 <- sqldf("select distinct Species as 'flower_type' from df1")
factor1    ## to print the names of factors

Sortie:

  flower_type
1      setosa
2  versicolor
3   virginica
4
Ann Rajaram

Si votre problème est spécifiquement de produire une liste de tous les niveaux pour un facteur, j'ai trouvé une solution simple en utilisant:

unique (df $ x)

Par exemple, pour le fameux jeu de données iris:

unique (iris $ espèces)

2

Ou en utilisant purrr:

data %>% purrr:map(levels)

Ou tout d'abord factoriser:

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

Et répondant à la question de savoir comment obtenir les longueurs:

data %>% map(levels) %>% map(length)
1
Amit Kohli