2013-06-20 7 views
28

Dato i seguenti dati finto:Come posso eliminare i livelli non utilizzati da un riquadro dati?

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') 

Creazione di una tabella di y$let cede

a b c d e 
0 20 21 22 18 

Ma non voglio a mostrare più. Se provo a fare questo:

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

ho pasticcio delle frequenze, dal momento che ora mi dà table(y$let)

b d c e 
0 20 21 40 

Sono consapevole che potevo fare xtabs(~ y$let, drop.unused.levels = T) e aggirare il problema, ma non è così ripristinare i livelli variabili al suo interno (che è importante per me, poiché questo è un cambiamento iniziale che sto apportando al set di dati che continuerà per tutta l'analisi). Inoltre, xtabs è una classe diversa da table, che mi darà mal di testa più avanti nel progetto.

La domanda è: come posso cambiare automaticamente levels(y$let) in modo che non mostri i livelli che sono stati rilasciati quando ho creato il sottoinsieme? In questo caso, come posso farlo mostrare [1] "b" "c" "d" "e"?

+3

La risposta vincente in cui duplica la domanda non è buona come la risposta qui. L'altro dovrebbe essere contrassegnato come un duplicato di questo poiché questa è una risposta MOLTO migliore – TheSteve0

risposta

103

C'è una funzione recentemente aggiunto in R per questo:

y <- droplevels(y) 
17

Basta fare y$let <- factor(y$let). L'esecuzione di factor su una variabile fattore esistente ripristinerà i livelli solo a quelli presenti.

1

aggiunta alla risposta di Hong Ooi, here is un esempio che ho trovato da R-blogger.

# 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) 
Problemi correlati