Trova il numero di righe usando dplyr / group_by

Sto usando il set di dati mtcars . Voglio trovare il numero di record per una particolare combinazione di dati. Qualcosa di molto simile al count(*) raggruppa per clausola in SQL. ddply() di plyr sta lavorando per me

 library(plyr) ddply(mtcars, .(cyl,gear),nrow) 

ha prodotto

  cyl gear V1 1 4 3 1 2 4 4 8 3 4 5 2 4 6 3 2 5 6 4 4 6 6 5 1 7 8 3 12 8 8 5 2 

Usando questo codice

 library(dplyr) g <- group_by(mtcars, cyl, gear) summarise(g, length(gear)) 

ha prodotto

  length(cyl) 1 32 

Ho trovato varie funzioni da summarise() ma nessuna sembra funzionare per me. Una funzione che ho trovato è sum(G) , che è ritornata

 Error in eval(expr, envir, enclos) : object 'G' not found 

Ho provato a usare n() , che è tornato

 Error in n() : This function should not be called directly 

Che cosa sto facendo di sbagliato? Come posso far funzionare group_by() / summarise() per me?

C’è una funzione speciale n() in dplyr per contare le righe (potenzialmente all’interno di gruppi):

 library(dplyr) mtcars %>% group_by(cyl, gear) %>% summarise(n = n()) #Source: local data frame [8 x 3] #Groups: cyl [?] # # cyl gear n # (dbl) (dbl) (int) #1 4 3 1 #2 4 4 8 #3 4 5 2 #4 6 3 2 #5 6 4 4 #6 6 5 1 #7 8 3 12 #8 8 5 2 

Ma dplyr offre anche una pratica funzione di count che fa esattamente lo stesso con meno digitazioni:

 count(mtcars, cyl, gear) # or mtcars %>% count(cyl, gear) #Source: local data frame [8 x 3] #Groups: cyl [?] # # cyl gear n # (dbl) (dbl) (int) #1 4 3 1 #2 4 4 8 #3 4 5 2 #4 6 3 2 #5 6 4 4 #6 6 5 1 #7 8 3 12 #8 8 5 2 

un altro approccio è usare il doppio punto:

 mtcars %>% dplyr::group_by(cyl, gear) %>% dplyr::summarise(length(gear)) 

Un’altra opzione, non necessariamente più elegante, ma non richiede di fare riferimento a una colonna specifica:

 mtcars %>% group_by(cyl, gear) %>% do(data.frame(nrow=nrow(.)))