You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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值再求和即可。

有两种简洁写法可选:

  1. 使用下标筛选符合条件的元素后求和
OutlierHours = sum(TotalHours[TotalHours > quantile(TotalHours, 0.8)])
  1. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:11:16