使用 group_by 查找子组中的百分比并进行总结
Finding percentage in a sub-group using group_by and summarise
我是 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)在一个月级别的百分比,即
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。如何计算当月所有类型的 sum(count) 总和?
尝试
library(dplyr)
data %>%
group_by(month) %>%
mutate(countT= sum(count)) %>%
group_by(type, add=TRUE) %>%
mutate(per=paste0(round(100*count/countT,2),'%'))
或者在不创建额外列的情况下使其更简单
data %>%
group_by(month) %>%
mutate(per = 100 *count/sum(count)) %>%
ungroup
我们也可以在 'month'
总结 sum(count)
之后使用 left_join
或使用 data.table
的选项。
library(data.table)
setkey(setDT(data), month)[data[, list(count=sum(count)), month],
per:= paste0(round(100*count/i.count,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
既然你想 "leave" 你的数据框不受影响,你不应该使用 summarise
,mutate
就足够了。
我们可以使用prop.table
得到每个组内的比例。
这可以写成dplyr
:
library(dplyr)
df %>% group_by(month) %>% mutate(per= prop.table(count) * 100)
# month type count per
# <chr> <chr> <dbl> <dbl>
# 1 Feb-14 bbb 341 9.63
# 2 Feb-14 ccc 527 14.9
# 3 Feb-14 aaa 2674 75.5
# 4 Mar-14 bbb 811 12.9
# 5 Mar-14 ccc 1045 16.7
# 6 Mar-14 aaa 4417 70.4
# 7 Apr-14 bbb 1178 16.4
# 8 Apr-14 ccc 1192 16.6
# 9 Apr-14 aaa 4793 66.9
#10 May-14 bbb 916 100
基础 R :
df$per <- with(df, ave(count, month, FUN = prop.table) * 100)
和data.table
:
library(data.table)
setDT(df)[, per := prop.table(count) * 100, month]
我是 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)在一个月级别的百分比,即
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。如何计算当月所有类型的 sum(count) 总和?
尝试
library(dplyr)
data %>%
group_by(month) %>%
mutate(countT= sum(count)) %>%
group_by(type, add=TRUE) %>%
mutate(per=paste0(round(100*count/countT,2),'%'))
或者在不创建额外列的情况下使其更简单
data %>%
group_by(month) %>%
mutate(per = 100 *count/sum(count)) %>%
ungroup
我们也可以在 'month'
总结sum(count)
之后使用 left_join
或使用 data.table
的选项。
library(data.table)
setkey(setDT(data), month)[data[, list(count=sum(count)), month],
per:= paste0(round(100*count/i.count,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
既然你想 "leave" 你的数据框不受影响,你不应该使用 summarise
,mutate
就足够了。
我们可以使用prop.table
得到每个组内的比例。
这可以写成dplyr
:
library(dplyr)
df %>% group_by(month) %>% mutate(per= prop.table(count) * 100)
# month type count per
# <chr> <chr> <dbl> <dbl>
# 1 Feb-14 bbb 341 9.63
# 2 Feb-14 ccc 527 14.9
# 3 Feb-14 aaa 2674 75.5
# 4 Mar-14 bbb 811 12.9
# 5 Mar-14 ccc 1045 16.7
# 6 Mar-14 aaa 4417 70.4
# 7 Apr-14 bbb 1178 16.4
# 8 Apr-14 ccc 1192 16.6
# 9 Apr-14 aaa 4793 66.9
#10 May-14 bbb 916 100
基础 R :
df$per <- with(df, ave(count, month, FUN = prop.table) * 100)
和data.table
:
library(data.table)
setDT(df)[, per := prop.table(count) * 100, month]