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

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)的思路有两个问题:

  1. 只是重复12个月前的值,没有实现累加逻辑;
  2. 你的数据行数是61,nrow(df)/12不是整数,会导致重复后的长度与原数据不匹配,直接报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:58:10