R语言按实体逐年计算Cumulative sum(累积求和)的实现方法
解决按ID跨年度累积求和的问题
问题分析
你需要为每个id计算跨年度的累积求和,但当前代码通过group_by(id, year)仅实现了年度内的累积,无法跨年度累加。正确的思路是先汇总每个id每年的总数,再基于年度汇总结果做跨年度累积。
解决方案代码
library(tidyverse) # 示例数据集 data <- data.frame(id=c("a","a","a","b","a","b","b"),cars=c(1,1,1,1,1,1,1),year=c(2001,2001,2002,2003,2003,2003,2004)) # 实现跨年度累积求和 data %>% # 1. 汇总每个id每年的cars总数 group_by(id, year) %>% summarise(year_total = sum(cars), .groups = "drop_last") %>% # 2. 按id计算跨年度累积求和 mutate(csum = cumsum(year_total)) %>% # 3. 调整列名和顺序匹配预期结果 select(id, cars = year_total, year, csum)
代码说明
- 汇总年度总数:通过
group_by(id, year)和summarise,将每个id同一年的多条记录合并为年度总数(比如a在2001年的2条1汇总为2)。 - 跨年度累积:此时分组仅保留
id,cumsum(year_total)会对每个id的年度总数逐年累加,实现跨年度累积效果。 - 调整列结构:用
select将year_total重命名为cars,并调整列顺序,与你期望的输出格式一致。
输出结果
运行代码后会得到如下结果:
# A tibble: 5 × 4 # Groups: id [2] id cars year csum <chr> <dbl> <dbl> <dbl> 1 a 2 2001 2 2 a 1 2002 3 3 a 1 2003 4 4 b 2 2003 2 5 b 1 2004 3
内容的提问来源于stack exchange,提问作者Coralie
相关产品推荐
相关产品推荐

