2016-03-30 10 views
8

dire che ho un set di dati come questo:dplyr numero di conteggio di un valore specifico della variabile

id <- c(1, 1, 2, 2, 3, 3) 
code <- c("a", "b", "a", "a", "b", "b") 
dat <- data.frame(id, code) 

Vale a dire,

id code 
1 1 a 
2 1 b 
3 2 a 
4 2 a 
5 3 b 
6 3 b 

Utilizzando dplyr, come potrei ottenere un conteggio di quanti un c'è sono per ogni id

esempio,

id countA 
1 1 1 
2 2 2 
3 3 0 

sto cercando cose come questa che non sta funzionando,

countA<- dat %>% 
group_by(id) %>% 
summarise(cip.completed= count(code == "a")) 

È possibile che questo mi dà un errore, "Errore: nessun metodo applicabile per 'group_by_' applicata a un oggetto della classe 'logica'"

Grazie per il vostro aiuto!

risposta

10

provare la seguente invece:

library(dplyr) 
dat %>% group_by(id) %>% 
    summarise(cip.completed= sum(code == "a")) 

Source: local data frame [3 x 2] 
    id cip.completed 
    (dbl)   (int) 
1  1    1 
2  2    2 
3  3    0 

Questo funziona perché la condizione logica code == a è solo una serie di zero e uno, e la somma di questa serie è il numero di occorrenze.

Nota che non si sarebbe necessariamente utilizzare dplyr::count all'interno summarise in ogni caso, in quanto è un wrapper per summarise chiamare sia n() o sum() stesso. Vedi ?dplyr::count. Se si desidera veramente utilizzare count, suppongo che si possa fare questo filtrando innanzitutto il set di dati in modo da conservare solo tutte le righe in cui code==a, e usando count darebbe quindi tutti i conteggi strettamente positivi (cioè non zero). Ad esempio,

dat %>% filter(code==a) %>% count(id) 

Source: local data frame [2 x 2] 

    id  n 
    (dbl) (int) 
1  1  1 
2  2  2 
+0

La somma ha funzionato. Grazie! –

Problemi correlati