2015-04-09 1 views
27

Я новичок в dplyr и стараюсь сделать следующее преобразование без везения. Я искал через Интернет, и я нашел примеры, чтобы сделать то же самое в ddply, но я бы хотел использовать dplyr.Поиск процента в подгруппе с использованием group_by и суммирование

У меня есть следующие данные:

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

Я хочу использовать dplyr, чтобы вычислить процент каждого типа (ааа, ГЭБ, ссс) на уровне месяца, т.е.

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

I» ve попытался

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

Это дает 1 в качестве каждого значения. Как суммировать сумму (количество) по всем типам месяца?

ответ

37

Попробуйте

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

Мы могли бы также использовать left_join после подведения итогов sum(count) на 'месяц'

Или вариант с использованием data.table.

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

И с немного меньшим количеством кода:

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 

Так как вы хотите, чтобы «оставить» ваш кадр данных нетронутым вы не должны использовать summarise, mutate будет достаточно.

+1

Dare Я называю это решение сексуальным? – vashts85

Смежные вопросы