R语言数据框中cumsum列历年同期值累加需求
解决方案:累加当前值及历年同期值
针对你的需求——新增一列计算cumsum当前值与所有前N个年度同期值的总和,这里提供几种简洁可行的R语言实现方案:
先明确你的数据结构
你的数据框包含从2000-01到2005-01的月度日期,cumsum列是从1开始的连续序列,共61行数据。
方案1:dplyr滞后值直接求和(固定滞后数)
如果你明确知道最多需要回溯的年度数(比如最多4年,即48个月),可以直接用lag()函数结合行级计算:
library(dplyr) df <- df %>% rowwise() %>% mutate( annual_sum = sum( cumsum, lag(cumsum, 12), # 1年前同期 lag(cumsum, 24), # 2年前同期 lag(cumsum, 36), # 3年前同期 lag(cumsum, 48), # 4年前同期 na.rm = TRUE # 忽略不存在的滞后值(比如前12行没有1年前数据) ) ) %>% ungroup()
方案2:按月份分组累加(灵活适配任意年份)
这种方法更通用,不需要提前确定回溯次数,直接按月份分组后累加历年同期值:
library(dplyr) df <- df %>% mutate(month = format(date, "%m")) %>% # 提取月份作为分组依据 group_by(month) %>% # 按同月分组 mutate(annual_sum = cumsum(cumsum)) %>% # 组内累加(即历年同月值总和) ungroup()
比如2001年1月的annual_sum就是2000年1月+2001年1月的值,2002年1月则是前两年的和加当前值,完全匹配你的需求。
方案3:zoo包滑动窗口求和
如果你习惯用滑动窗口工具,zoo包的rollapply()可以精准定位历年同期位置:
library(zoo) library(dplyr) df <- df %>% mutate( annual_sum = rollapply( cumsum, width = list(seq(0, nrow(df)-1, 12)), # 取当前行及往前每12行的位置 FUN = sum, fill = cumsum, # 对没有滞后值的行填充当前值 align = "right" # 以当前行为基准对齐 ) )
关于你之前尝试方法的问题
你用rep(lag(cumsum,12), nrow(df)/12)的思路有两个问题:
- 只是重复12个月前的值,没有实现累加逻辑;
- 你的数据行数是61,
nrow(df)/12不是整数,会导致重复后的长度与原数据不匹配,直接报错。
内容的提问来源于stack exchange,提问作者Sulz
相关产品推荐
相关产品推荐

