Поиск процента в подгруппе с использованием group_by и суммирование
Я новичок в dplyr и стараюсь сделать следующее преобразование без везения. Я искал через Интернет, и я нашел примеры, чтобы сделать то же самое в ddply, но я бы хотел использовать dplyr.
У меня есть следующие данные:
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 для вычисления процента каждого типа (aaa, bbb, ccc) на уровне месяца i.e.
month type count per
1 Feb-14 bbb 341 9.6%
2 Feb-14 ccc 527 14.87%
3 Feb-14 aaa 2674 ..
.. ... ... ...
Я пробовал
data %>%
group_by(month, type) %>%
summarise(count / sum(count))
Это дает 1 как каждое значение. Как суммировать сумму (количество) по всем типам месяца?
Ответы
Ответ 1
Try
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), '%')][]
Ответ 2
И с меньшим количеством кода:
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
будет достаточно.