2016-06-07 15 views
1

zu generieren Ich möchte die Anzahl der Fälle innerhalb einer Gruppe zusammenfassen und zählen und die Ausgabe eine Null in einer Gruppe platzieren, wo keine Fälle vorhanden sind. Zum Beispiel:Verwenden Sie alle möglichen Ebenen eines Faktors, um Null Länge() in einer Ausgabe

library(dplyr) 

df <- structure(list(Station = c("TR1", "TR1", "TR1", "TR1", "TR1", 
          "TR1", "TR1", "TR1", "TR2", "TR2", "TR2", "TR2", "TR2", "TR2", 
          "TR2"), Age = c(1, 1, 1, 2, 2, 3, 4, 4, 1, 1, 1, 1, 3, 4, 4), 
       WeightTurtles = c(21, 22, 20, 43, 32, 32, 27, 32, 21, 22, 
           20, 15, 32, 37, 34)), class = c("tbl_df", "tbl", "data.frame" 
           ), row.names = c(NA, -15L), .Names = c("Station", "Age", "WeightTurtles" 
           )) 

df %>% 
    group_by(Station, Age) %>% 
    summarise(NumTurtles=length(WeightTurtles)) 

Hier ist das Ergebnis:

Station Age NumTurtles 
    (chr) (dbl)  (int) 
1  TR1  1   3 
2  TR1  2   2 
3  TR1  3   1 
4  TR1  4   2 
5  TR2  1   4 
6  TR2  3   1 
7  TR2  4   2 

Was würde Ich mag eine Zeile in der obigen Ausgabe enthalten, die wie folgt aussieht:

5  TR2  2   0 

So dass ist, wie schließe ich Vorkommen (oder das Fehlen von Vorkommen sozusagen) für Ebenen auf einem Faktor ein, die null Länge haben. Allgemeiner gesagt, wie sage ich R, alle möglichen Ebenen eines Faktors zu verwenden, um die Länge zu zählen?

+0

'as.data.frame (Tabelle (df ​​[1: 2])) ' – user20650

+0

Danke. Gibt es eine Methode innerhalb eines 'dplyr'-Frameworks? – boshek

+0

ha, idk sorry, ich bin eine Bastion für Base R;). – user20650

Antwort

2

Sie können dies mit der complete Funktion von tidyr. complete fügt eine Zeile für die fehlende Gruppe und füllt NA für den Wert von WeightTurtles für diese Zeile (es sei denn, Sie einen anderen Füllwerts wählen):

library(dplyr) 
library(tidyr) 

df %>% 
    complete(Age, nesting(Station)) %>% 
    group_by(Station, Age) %>% 
    summarise(NumTurtles=sum(!is.na(WeightTurtles))) 
Station Age NumTurtles 
1  TR1  1   3 
2  TR1  2   2 
3  TR1  3   1 
4  TR1  4   2 
5  TR2  1   4 
6  TR2  2   0 
7  TR2  3   1 
8  TR2  4   2 
0

Hier ist eine Lösung, die ich mit dplyr denken kann:

library(dplyr) 
df <- left_join(expand.grid(Station = unique(df$Station), 
          Age = unique(df$Age), stringsAsFactors = FALSE), 
       df) 
df %>% 
    group_by(Station, Age) %>% 
    summarise(NumTurtles = sum(!is.na(WeightTurtles))) 

Source: local data frame [8 x 3] 
Groups: Station [?] 

    Station Age NumTurtles 
    <chr> <dbl>  <int> 
1  TR1  1   3 
2  TR1  2   2 
3  TR1  3   1 
4  TR1  4   2 
5  TR2  1   4 
6  TR2  2   0 
7  TR2  3   1 
8  TR2  4   2