2016-03-18 9 views
2

ich ein data.frame triviale mit dplyr mit folgendem aggregieren kann:R: Aggregat von allen Faktorstufen (vorhanden und nicht vorhanden)

z <- data.frame(a = rnorm(20), b = rep(letters[1:4], each = 5)) 

library(dplyr) 

z %>% 
    group_by(b) %>% 
    summarise(out = n()) 

Source: local data frame [4 x 2] 

     b out 
    (fctr) (int) 
1  a  5 
2  b  5 
3  c  5 
4  d  5 

jedoch manchmal ein Datensatz einen Faktor fehlen. In diesem Fall hätte ich gerne die Ausgabe 0.

Nehmen wir an, der typische Datensatz sollte 5 Gruppen haben.

z$b <- factor(z$b, levels = letters[1:5]) 

Aber klar gibt es nicht in diese besondere aber in eine andere sein könnte. Wie kann ich diese Daten so aggregieren, dass die length für fehlende factors0 ist.

gewünschte Ausgabe:

Source: local data frame [4 x 2] 

     b out 
    (fctr) (int) 
1  a  5 
2  b  5 
3  c  5 
4  d  5 
5  e  0 
+0

Sie können 'tapply' wie diese' tapply (z $ b, z $ b, Länge) ' – Raad

+1

Ich denke, das ist eine [offene Frage auf GitHub] (https://github.com/hadley/dplyr/issues/341). – JasonAizkalns

Antwort

1

Eine Möglichkeit, dies zu erreichen, ist die Verwendung von complete von "tidyr". Sie müssen verwenden mutate ersten Spalte "b" Faktor:

library(dplyr) 
library(tidyr) 

z %>% 
    mutate(b = factor(b, letters[1:5])) %>% 
    group_by(b) %>% 
    summarise(out = n()) %>% 
    complete(b, fill = list(out = 0)) 
# Source: local data frame [5 x 2] 
# 
#  b out 
# (fctr) (dbl) 
# 1  a  5 
# 2  b  5 
# 3  c  5 
# 4  d  5 
# 5  e  0 
1

Eine Abhilfe mit einer Tabelle alle Ebenen enthält, zu verbinden ist:

z <- full_join(z, data.frame(b=levels(z$b)) 

Diese alle fehlenden Zeilen für Ihre Analysevariablen auf NA eingestellt werden, die in den Ein allgemeiner Fall würde mehr Sinn machen, als ihn auf Null zu setzen. Sie können sie bei Bedarf mit auf Null setzen.

Verwandte Themen