2013-06-20 13 views
28

Biorąc pod uwagę następujące dane makiety:Jak mogę usunąć nieużywane poziomy z ramki danych?

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

Tworzenie spisu y$let daje

a b c d e 
0 20 21 22 18 

Ale nie chcę a aby zobaczyć więcej. Gdy próbuję to zrobić:

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

I bałagan częstotliwości, ponieważ teraz table(y$let) daje mi

b d c e 
0 20 21 40 

Jestem świadomy mogłem zrobić xtabs(~ y$let, drop.unused.levels = T) i obejść ten problem, ale to nie robi zresetuj poziomy zmiennych w swoim rdzeniu (co jest dla mnie ważne, ponieważ jest to wczesna zmiana, którą wprowadzam do zestawu danych, który będzie się toczył przez całą analizę). Co więcej, xtabs to inna klasa niż table, która wywoła u mnie ból głowy w dalszej części projektu.

Pytanie brzmi: w jaki sposób mogę automatycznie zmienić levels(y$let), aby nie wyświetlały poziomów, które zostały usunięte po utworzeniu podzbioru? W takim przypadku, jak mogę sprawić, by było wyświetlane [1] "b" "c" "d" "e"?

+3

Zwycięska odpowiedź na pytanie powielone nie jest tak dobra jak odpowiedź tutaj. Drugi powinien być oznaczony jako duplikat tego, ponieważ jest to DUŻO lepsza odpowiedź – TheSteve0

Odpowiedz

103

Tam niedawno dodana funkcja w R dla tego:

y <- droplevels(y) 
17

Po prostu wykonaj y$let <- factor(y$let). Uruchomienie factor na istniejącej zmiennej czynnika spowoduje zresetowanie poziomów tylko do tych, które są obecne.

1

Dodawanie do odpowiedzi Hong Ooi'S, here is przykładowa znalazłem z R-blogerów.

# 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) 
Powiązane problemy