2013-06-20 10 views
28

die folgenden Mock Daten Gegeben:Wie kann ich ungenutzte Ebenen aus einem Datenrahmen löschen?

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

eine Tabelle von y$let Erstellen ergeben

a b c d e 
0 20 21 22 18 

Aber ich will nicht a mehr zeigen. Wenn ich versuche, dies zu tun:

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

I Schlamassel die Frequenzen, da jetzt table(y$let) mir gibt

b d c e 
0 20 21 40 

Ich bin mir bewusst, ich xtabs(~ y$let, drop.unused.levels = T) und arbeitet, um das Problem tun könnte, aber es funktioniert nicht Setzen Sie die variablen Ebenen in ihrem Kern zurück (was für mich wichtig ist, da dies eine frühe Änderung ist, die ich an dem Datensatz mache, der während der gesamten Analyse weitergehen wird). Außerdem ist xtabs eine andere Klasse als table, was mir später im Projekt Kopfschmerzen bereiten wird.

Die Frage ist: Wie kann ich automatisch levels(y$let) ändern, so dass es keine Ebenen zeigt, die beim Erstellen der Teilmenge gelöscht wurden? In diesem Fall, wie kann ich es [1] "b" "c" "d" "e" zeigen lassen?

+3

Die gewinnende Antwort in der doppelten Frage ist nicht so gut wie die Antwort hier. Der andere sollte als ein Duplikat markiert werden, da dies eine viel bessere Antwort ist – TheSteve0

Antwort

103

Es gibt eine kürzlich hinzugefügte Funktion in R hierfür:

y <- droplevels(y) 
17

Tun Sie einfach y$let <- factor(y$let). Wenn factor für eine vorhandene Faktorvariable ausgeführt wird, werden die Ebenen nur auf die vorhandenen zurückgesetzt.

1

nach Hong Ooi Antwort Hinzufügen here is ein Beispiel, das ich von R-Bloggers gefunden.

# 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) 
Verwandte Themen