2013-05-14 9 views
12

Załóżmy, że mam data.table:Użyj kolumnę czynnikiem „za” i nie upuścić pustych czynniki

x <- data.table(x=runif(3), group=factor(c('a','b','a'), levels=c('a','b','c'))) 

chcę wiedzieć, ile wierszy w x istnieć dla każdego group:

x[, .N, by="group"] 
# group N 
# 1:  a 2 
# 2:  b 1 

Pytanie: czy istnieje sposób wymuszenia powyższego by="group", aby uwzględnić wszystkie poziomy czynnika group?

Zauważ, że skoro nie mam żadnych wierszy z group "c" w tabeli, nie otrzymam wiersza dla c.

Pożądany wyjściowa:

x[, .N, by="group", ???] # somehow use all levels in `group` 
# group N 
# 1:  a 2 
# 2:  b 1 
# 3:  c 0 
+0

Dlaczego nie dodać brakujące poziomy potem coś takiego 'seryjnej (Y, data.table (grupa = poziomach (x [grupa])), przez = "grupy", wszystko = true), a następnie' zamień 'NA's na 0? – Roland

+0

Nie znam ogólnego rozwiązania, ale dla samego '.N' możesz powrócić na' table': 'x [, table (group)]' (jak zapewne już wiesz). – Frank

Odpowiedz

14

Jeśli jesteś gotów do uruchomienia przez poziomy czynnika przez wyliczanie ich i (zamiast przez ustawienie by="group"), to będzie Ci nadzieję na wynikach.

setkey(x, "group") 
x[levels(group), .N, by=.EACHI] 
# group N 
# 1:  a 2 
# 2:  b 1 
# 3:  c 0 
+0

Aha, działa to świetnie! Twoje zdrowie. –

+0

@Henrik - Dobry haczyk! Dziękuję za to. Zmieniono je oba. –

Powiązane problemy