2015-04-09 10 views
27

Sono nuovo a dplyr e sto provando a fare la seguente trasformazione senza fortuna. Ho cercato su internet e ho trovato esempi per fare lo stesso in ddply, ma mi piacerebbe usare dplyr.Trovare la percentuale in un sottogruppo usando group_by e riepilogare

ho i seguenti dati:

month type count 
1 Feb-14 bbb 341 
2 Feb-14 ccc 527 
3 Feb-14 aaa 2674 
4 Mar-14 bbb 811 
5 Mar-14 ccc 1045 
6 Mar-14 aaa 4417 
7 Apr-14 bbb 1178 
8 Apr-14 ccc 1192 
9 Apr-14 aaa 4793 
10 May-14 bbb 916 
.. ... ... ... 

voglio usare dplyr per calcolare la percentuale di ogni tipo (aaa, bbb, ccc) ad un esempio, il livello mese

month type count per 
1 Feb-14 bbb 341 9.6% 
2 Feb-14 ccc 527 14.87% 
3 Feb-14 aaa 2674 .. 
.. ... ... ... 

I' ve provato

data %>% 
    group_by(month, type) %>% 
    summarise(count/sum(count)) 

Questo dà un 1 come ogni valore. Come faccio a calcolare la somma (contare) su tutti i tipi del mese?

risposta

37

Prova

library(dplyr) 
data %>% 
    group_by(month) %>% 
    mutate(countT= sum(count)) %>% 
    group_by(type, add=TRUE) %>% 
    mutate(per=paste0(round(100*count/countT,2),'%')) 

Potremmo anche utilizzare left_join dopo aver riassunto la sum(count) da 'mese'

O un'opzione con data.table.

library(data.table) 
setkey(setDT(data), month)[data[, list(count=sum(count)), month], 
       per:= paste0(round(100*count/i.count,2), '%')][] 
19

E con un po 'meno codice:

df <- data.frame(month=c("Feb-14", "Feb-14", "Feb-14", "Mar-14", "Mar-14", "Mar-14", "Apr-14", "Apr-14", "Apr-14", "May-14"), 
      type=c("bbb", "ccc", "aaa", "bbb", "ccc", "aaa", "bbb", "ccc", "aaa", "bbb"), 
      count=c(341, 527, 2674, 811, 1045, 4417, 1178, 1192, 4793, 916)) 


library(dplyr) 

df %>% group_by(month) %>% 
     mutate(per=paste0(round(count/sum(count)*100, 2), "%")) %>% 
     ungroup 

Dal momento che si vuole "lasciare" la cornice di dati intatta non si dovrebbe usare summarise, mutate sarà sufficiente.

+1

Posso chiamare questa soluzione sexy? – vashts85

Problemi correlati