Sono nuovo di dplyr e sto cercando di 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.
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 livello mese cioè
month type count per 1 Feb-14 bbb 341 9.6% 2 Feb-14 ccc 527 14.87% 3 Feb-14 aaa 2674 .. .. ... ... ...
ho provato
data %>% group_by(month, type) %>% summarise(count / sum(count))
Questo dà un 1 come valore. Come faccio a calcolare la sum (contare) su tutti i tipi del mese?
Provare
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 usare left_join
dopo aver riassunto la sum(count)
per “mese”
O un’opzione che usa data.table
.
library(data.table) setkey(setDT(data), month)[data[, list(count=sum(count)), month], per:= paste0(round(100*count/i.count,2), '%')][]
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
Dato che vuoi “lasciare” intatto il tuo frame di dati, non dovresti usare il summarise
, il mutate
sarà sufficiente.