web-dev-qa-db-fra.com

Trouver un pourcentage dans un sous-groupe en utilisant group_by et résumer

Je suis nouveau sur dplyr et j'essaye de faire la transformation suivante sans aucune chance. J'ai cherché sur Internet et j'ai trouvé des exemples pour faire la même chose dans ddply mais j'aimerais utiliser dplyr.

J'ai les données suivantes:

   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
..    ...  ...   ...

Je veux utiliser dplyr pour calculer le pourcentage de chaque type (aaa, bbb, ccc) au niveau du mois, c'est-à-dire.

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

J'ai essayé

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

Cela donne un 1 pour chaque valeur. Comment puis-je faire la somme (count) somme sur tous les types dans le mois?

35
KC.

Essayer

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

Nous pourrions également utiliser left_join Après avoir résumé la sum(count) par 'mois'

Ou une option utilisant data.table.

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

Et avec un peu moins de code:

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

Puisque vous voulez "laisser" votre bloc de données intact, vous ne devez pas utiliser summarise, mutate suffira.

33
dimitris_ps