Znajdowanie procentu w podgrupie za pomocą grupy według i podsumowania

Jestem nowy w dplyr i próbuję wykonać następującą transformację bez powodzenia. Szukałem w Internecie i znalazłem przykłady, aby zrobić to samo w ddply, ale chciałbym użyć dplyr.

Mam następujące dane:

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

Chcę użyć dplyr do obliczenia procentu każdego typu (aaa, bbb, ccc) na poziomie miesiąca, czyli

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

Próbowałem

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

To daje 1 jako każdą wartość. Jak zrobić sumę (count) sumy we wszystkich typach w miesiąc?

Author: Jaap, 2015-04-10

2 answers

Spróbuj

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

Możemy również użyć left_join po podsumowaniu sum(count) przez "miesiąc"

Lub opcja za pomocą data.table.

 library(data.table)
 setkey(setDT(data), month)[data[, list(count=sum(count)), month], 
               per:= paste0(round(100*count/i.count,2), '%')][]
 47
Author: akrun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-09 22:08:53

I z nieco mniejszym kodem:

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

Ponieważ chcesz" zostawić " ramkę danych nietkniętą, nie powinieneś używać summarise, mutate wystarczy.

 24
Author: dimitris_ps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-10 00:36:22