如何用dplyr按组计算含80分位数以上小时数求和的汇总统计?
分组统计数据框的条件求和实现
数据框结构示例
df <- data.frame(FY = c(2018, 2018, 2019, 2019, 2020, 2020), WorkArea = c("03218", "03219", "07589", "07589", "01125", "01126"), ProjectCode = c(12, 12, 13, 11, 12, 12), TotalHours = c(180, 250, 125, 300, 450, 750))
需要生成的统计量
按FY/WorkArea/ProjectCode分组后,需计算:
- 操作次数
- 总小时数
- 平均小时数
- 中位数小时数
- 小时数第一四分位数
- 小时数第三四分位数
- 小时数大于80分位数的操作次数
- 小时数大于80分位数的总小时数
已完成的代码
df_table <- df %>% group_by(FY, WorkArea, ProjectCode) %>% summarise(opCount = n(), Hours = sum(TotalHours), AvgHours = Hours/opCount, medHours = median(TotalHours), Bottom25 = quantile(TotalHours, 0.25), Top25 = quantile(TotalHours, 0.75), OutlierCount = sum(TotalHours > quantile(TotalHours, 0.8)) )
条件求和的实现方法
要计算小时数大于80分位数的总小时数,可以沿用计算OutlierCount的逻辑,通过提取分组内符合条件的TotalHours值再求和即可。
有两种简洁写法可选:
- 使用下标筛选符合条件的元素后求和
OutlierHours = sum(TotalHours[TotalHours > quantile(TotalHours, 0.8)])
- 使用
ifelse做条件判断后求和
OutlierHours = sum(ifelse(TotalHours > quantile(TotalHours, 0.8), TotalHours, 0))
完整代码
df_table <- df %>% group_by(FY, WorkArea, ProjectCode) %>% summarise(opCount = n(), Hours = sum(TotalHours), AvgHours = Hours/opCount, medHours = median(TotalHours), Bottom25 = quantile(TotalHours, 0.25), Top25 = quantile(TotalHours, 0.75), OutlierCount = sum(TotalHours > quantile(TotalHours, 0.8)), OutlierHours = sum(TotalHours[TotalHours > quantile(TotalHours, 0.8)]) )
注:如果分组内数据量极小(如仅1行),
quantile(TotalHours, 0.8)会等于该行的TotalHours,此时OutlierCount和OutlierHours都会为0,符合统计逻辑。
内容的提问来源于stack exchange,提问作者jerH
相关产品推荐
相关产品推荐

