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

R语言cumsum函数按area-period组合分组实现累计求和的问题处理

问题核心根源
  • 现有代码累计值跨组失真的本质原因:在summarise步骤设置了.groups = 'drop',直接清空了数据集所有分组属性,后续mutate运行cumsum时,是对整个表格的列值做全局累计,完全不会识别area、period的组边界。
  • 这也刚好匹配观测到的现象:前4行属于001/2020q1的完整分组,全表累计从表格第一行开始计算,刚好能算出这部分的正确累计值;等进入后续分组时,累计值没有按组重置,就会完全偏离预期。
  • 原有分组逻辑本身没有方向错误:group_by(area, period, small)的设置是匹配需求的——我们的累计本来就需要在同一个area+period组合内,顺着small的档级顺序逐档累加,不需要把small从分组维度中移除。
  • 附带的常见操作误区:直接用cumsum的结果覆盖原始聚合得到的employment、worksites值,会丢失原始档级的数值基础,反而增加排障难度。
修正后的实现方案
library(dplyr)

# 原有样本数据
employment <- c(1,45,125,130,165,260,2,46,127,132,167,265,50,61,110,121,170,305,55,66,112,123,172,310)
small <- c(1,1,2,2,3,4,1,1,2,2,3,4,1,1,2,2,3,4,1,1,2,2,3,4)
area <-c(001,001,001,001,001,001,001,001,001,001,001,001,003,003,003,003,003,003,003,003,003,003,003,003)
year<-c(2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020,2020)
qtr <-c(1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2)
smbtest <- data.frame(employment,small,area,year,qtr)

smbsummary2 <- smbtest %>%
  mutate(period = paste0(year, "q", qtr)) %>%
  select(area, period, employment, small) %>%
  # 第一步:按档级聚合,拿到每个small分档的原始汇总值
  group_by(area, period, small) %>%
  summarise(
    employment = sum(employment),
    worksites = n(),
    .groups = "drop" # 清空所有细分维度的分组,得到纯净的聚合明细
  ) %>%
  # 第二步:按累计需要的边界维度重新分组,逻辑完全可控
  group_by(area, period) %>%
  # 组内计算累计值,不会跨组边界
  mutate(
    employment_cum = cumsum(employment),
    worksites_cum = cumsum(worksites)
  ) %>%
  ungroup() # 计算完成后清空分组,适配后续数据操作
实现效果说明
  • 累计计算严格以area+period的4类组合为边界:每个组合内从small=1开始逐档累加,当切换到下一个组合时,累计值自动重置计算基数,不会将上一个组合的累计结果带入下一组。
  • 结果集中同时保留每个分档的原始汇总值与对应累计值,无需额外拆分核对数值。

内容的提问来源于stack exchange,提问作者Tim Wilcox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 04:54:03