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

如何在R中结合时间维度计算分组累计求和(大数据场景)

解决方案

针对你的需求,需要解决两个核心问题:一是把cumval从列表格式转为单个数值,二是保证代码在百万行数据上的运行效率。你之前用mapply逐行计算的方式效率极低,推荐用以下高效的分组汇总+窗口函数方法:

步骤说明

  1. 先按id、year、d汇总得到每个组合的销售额总和valuesum(和你第一步操作一致);
  2. 对每个id计算每年的总销售额,再基于年度总额计算累计和,通过偏移一位得到当前年份之前所有年份的累计总和;
  3. 将计算好的累计值关联回原汇总表,得到最终结果。

完整代码

library(dplyr)

# 1. 按id-year-d汇总销售额
df_sum <- df %>% 
  group_by(id, year, d) %>% 
  summarise(valuesum = sum(value), .groups = "drop")

# 2. 计算每个id下,各年份之前的累计总和
year_cum <- df_sum %>% 
  group_by(id, year) %>% 
  summarise(year_total = sum(valuesum), .groups = "drop") %>% 
  group_by(id) %>% 
  arrange(year) %>% 
  # 计算年度累计和
  mutate(cum_total = cumsum(year_total)) %>% 
  # 偏移一位,得到当前年份之前的累计总和(默认最早年份的之前累计为0)
  mutate(prev_cum = lag(cum_total, default = 0)) %>% 
  select(id, year, prev_cum)

# 3. 关联回原汇总表,得到最终结果
result <- df_sum %>% 
  left_join(year_cum, by = c("id", "year")) %>% 
  rename(cumval = prev_cum)

# 查看结果
result

结果验证

运行上述代码后,result的结构和数值完全匹配你给出的期望输出:

# A tibble: 9 × 5
  id    year d     valuesum cumval
  <chr> <dbl> <chr>    <dbl>  <dbl>
1 A      2000 PER          1      0
2 A      2000 USA          2      0
3 A      2001 USA          7      3
4 A      2002 USA          5     10
5 A      2003 USA          6     15
6 A      2007 USA          7     21
7 B      2004 ECU          8      0
8 B      2004 SPA         10      0
9 B      2005 ECU          9     18

效率优势

这种方法避免了逐行循环计算,先通过年度汇总减少数据量,再用窗口函数批量计算累计值,对于百万行级别的数据,运行速度会比你之前的mapply方法提升几个数量级。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:20:19