r - 多维度分组,汇总并添加计算列
问题描述
我有这个df:
boxChange sameCat
# C1 > C2 TRUE
# C1 > C2 TRUE
# A0 > A1 TRUE
# A1 > E4 FALSE
# C3 > E6 FALSE
# E0 > E3 TRUE
# ... ...
我想按两列分组,计算出现次数并按它们的数量排列。通过使用dplyr
我会这样:
df2 <- df %>%
group_by(boxChange, sameCat) %>%
summarise(occs = n()) %>%
arrange(desc(occs))
获得:
boxChange sameCat occs
# C1 > C2 TRUE 312
# A0 > A1 TRUE 189
# E0 > E3 TRUE 13
# C3 > E6 FALSE 123
# A1 > E4 FALSE 70
现在我想计算每个occs
占总数的百分比和累积百分比,得到这样的东西
boxChange sameCat occs perc cump
# C1 > C2 TRUE 312 44 44
# A0 > A1 TRUE 189 27 71
# E0 > E3 TRUE 13 2 73
# C3 > E6 FALSE 123 17 90
# A1 > E4 FALSE 70 10 100
我尝试了以下
df2 <- df %>%
group_by(boxChange, sameCat) %>%
summarise(occs = n()) %>%
arrange(desc(occs)) %>%
mutate(perc = occs/sum(occs)*100) %>%
mutate(cump = cumsum(perc))
但输出如下
boxChange sameCat occs perc cump
# C1 > C2 TRUE 312 100 100
# A0 > A1 TRUE 189 100 100
# E0 > E3 TRUE 13 100 100
# C3 > E6 FALSE 123 100 100
# A1 > E4 FALSE 70 100 100
我不明白为什么会这样,也找不到任何其他报告类似问题的线程。你有什么见解吗?
解决方案
我们可能需要ungroup
df2 <- df %>%
group_by(boxChange, sameCat) %>%
summarise(occs = n()) %>%
arrange(desc(occs)) %>%
ungroup %>%
mutate(perc = occs/sum(occs)*100,
cump = cumsum(perc))
--
或者,如果我们需要保持分组完整,请使用sum(.$occs)
更新
如果我们从 OP 的arraged
'occs'
df %>%
ungroup %>%
mutate(perc = round(occs/sum(occs) * 100),
cump = cumsum(perc))
# boxChange sameCat occs perc cump
#1 C1 > C2 TRUE 312 44 44
#2 A0 > A1 TRUE 189 27 71
#3 E0 > E3 TRUE 13 2 73
#4 C3 > E6 FALSE 123 17 90
#5 A1 > E4 FALSE 70 10 100
推荐阅读
- google-api - Google OAuth 同意域验证问题
- python-3.x - 不能for循环遍历python中的整个列表
- python - Python - 启用了扩展的 Selenium 的全页截图
- powershell - 如何从 1 个设备中获取添加删除程序列表并将其与其他设备进行比较
- wordpress - WordPress JetPack - xmlrpc.php 问题
- python - 在 Pandas 中按列号更改多个列名?
- javascript - 复制到剪贴板在 reactjs 中没有按预期工作
- dockerfile - Dockerfile 使用 RHEL8 UBI 镜像注册订阅
- amazon-web-services - 如何在 AWS Cloudformation 中使用 !Join 和 !FindInMap 创建名称标签
- rust - 移入闭包的结构从外部借用参考