web-dev-qa-db-fra.com

Comment supprimer des niveaux inutilisés d'une trame de données?

Étant donné les données factices suivantes:

set.seed(123)
x <- data.frame(let = sample(letters[1:5], 100, replace = T), 
                num = sample(1:10, 100, replace = T))
y <- subset(x, let != 'a')

Création d'une table de y$let Rendements

a  b  c  d  e 
0 20 21 22 18

Mais je ne veux plus que a s'affiche. Si j'essaye de faire ceci:

levels(y$let) <- factor(y$let)

Je gâche les fréquences, puisque maintenant table(y$let) me donne

b  d  c  e 
0 20 21 40 

Je suis conscient que je pourrais faire xtabs(~ y$let, drop.unused.levels = T) et contourner le problème, mais cela ne réinitialise pas les niveaux variables à sa base (ce qui est important pour moi, car il s'agit d'un changement précoce que j'apporte à l'ensemble de données qui se poursuivra tout au long de l'analyse). De plus, xtabs est une classe différente de table, ce qui me donnera des maux de tête plus tard dans le projet.

La question est: comment puis-je changer automatiquement levels(y$let) pour ne pas afficher les niveaux qui ont été supprimés lorsque j'ai créé le sous-ensemble? Dans ce cas, comment puis-je faire afficher [1] "b" "c" "d" "e"?

39
Waldir Leoncio

Il y a une fonction récemment ajoutée dans R pour cela:

y <- droplevels(y)
115
Señor O

Faites simplement y$let <- factor(y$let). L'exécution de factor sur une variable de facteur existante réinitialisera les niveaux uniquement à ceux qui sont présents.

21
Hong Ooi

Ajout à la réponse de Hong Ooi, voici un exemple que j'ai trouvé de R-Bloggers.

# Create some fake data
x <- as.factor(sample(head(colors()),100,replace=TRUE))
levels(x)
x <- x[x!="aliceblue"]
levels(x) # still the same levels
table(x) # even though one level has 0 entries!

The solution is simple: run factor() again:
x <- factor(x)
levels(x)
2
OmegaSupreme