如何在dplyr管道中按两类分组计算数值占比?
简化按分组计算占比的实现方法
当然有更简洁的实现方式啦!你原来的代码需要先单独汇总分组总和,再通过连接把结果合并回去,其实用dplyr的窗口函数就能一步完成,不用额外生成中间表和做连接操作,代码会更紧凑易读。
优化后的完整代码
library(dplyr) # 模拟数据 haves <- data.frame( date = as.Date(c("2019-01-01", "2019-01-01", "2019-01-01", "2019-02-01", "2019-02-01")), value = c(10, 22, 44, 8, 10), cat = c("a", "a", "b", "c", "c") ) # 一步计算目标结果 wants <- haves %>% group_by(date, cat) %>% mutate( total_value = sum(value), # 窗口函数:计算当前date+cat组的总和 percentage_of_total = (value / total_value) * 100 ) %>% ungroup() # 可选:如果不需要保留分组状态可以取消分组 wants
代码解释
- 直接在
group_by(date, cat)之后使用mutate,sum(value)会自动在每个分组内计算总和,并将这个值填充到该分组的每一行中——这就是窗口函数的作用,完全不需要单独做summarise。 - 省去了中间的
sum_stats表和inner_join步骤,代码逻辑更连贯,也减少了出错的可能。 - 运行后得到的结果和你想要的完全一致:
# A tibble: 5 × 5 date value cat total_value percentage_of_total <date> <dbl> <chr> <dbl> <dbl> 1 2019-01-01 10 a 32 31.2 2 2019-01-01 22 a 32 68.8 3 2019-01-01 44 b 44 100 4 2019-02-01 8 c 18 44.4 5 2019-02-01 10 c 18 55.6
另外,你原来代码里加载了lubridate但没用到,优化后的代码里可以去掉这个不必要的加载哦😉
内容的提问来源于stack exchange,提问作者cs0815
相关产品推荐
相关产品推荐

