如何在R中结合时间维度计算分组累计求和(大数据场景)
解决方案
针对你的需求,需要解决两个核心问题:一是把cumval从列表格式转为单个数值,二是保证代码在百万行数据上的运行效率。你之前用mapply逐行计算的方式效率极低,推荐用以下高效的分组汇总+窗口函数方法:
步骤说明
- 先按
id、year、d汇总得到每个组合的销售额总和valuesum(和你第一步操作一致); - 对每个
id计算每年的总销售额,再基于年度总额计算累计和,通过偏移一位得到当前年份之前所有年份的累计总和; - 将计算好的累计值关联回原汇总表,得到最终结果。
完整代码
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
相关产品推荐
相关产品推荐

