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?
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), '%')][]
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.