2015-04-09 17 views
27

Jestem nowy dla dplyr i próbuję wykonać następującą transformację bez żadnego szczęścia. Szukałem w Internecie i znalazłem przykłady, aby zrobić to samo w ddply, ale chciałbym użyć dplyr.Znajdowanie procentu w podgrupach za pomocą group_by i podsumowanie

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 obliczyć procentową każdego typu (aaa, bbb, ccc) w IE poziomie miesięcy

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

I” próbowano:

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

Daje to 1 jako każdą wartość. Jak zsumować sumę wszystkich typów w danym miesiącu?

Odpowiedz

37

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 opcji używając data.table.

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

I z trochę mniej kodu:

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 „opuścić” ramka dane nietknięte nie należy używać summarise, mutate wystarczy.

+1

Czy mogę nazwać to rozwiązanie seksownym? – vashts85

Powiązane problemy