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

如何计算各ID的Flag字段3个月滚动求和?附R语言示例数据

实现每个ID的Flag字段3个月滚动求和

嘿,我来帮你搞定这个滚动求和的需求!首先咱们得先把数据处理好,再用合适的工具计算时间窗口内的累积和。

第一步:数据准备与日期格式转换

首先先把你提供的示例数据正确加载,然后把Date列从字符串转换成R能识别的日期格式——这是计算时间窗口的关键一步:

# 加载示例数据
dt <- read.table(header = TRUE, text = '
ID Date       Flag
1  1/30/2012  1
1  2/29/2012  1
1  3/30/2012  1
1  4/30/2012  1
1  5/30/2012  1
1  6/30/2012  1
1  7/30/2012  0
1  8/30/2012  0
1  9/30/2012  0
1  10/30/2012 0
1  11/30/2012 0
1  12/30/2012 0
2  1/30/2014  1
2  2/28/2014  1
2  3/30/2014  1
2  4/30/2014  1
2  5/30/2014  1
2  6/30/2014  1
2  7/30/2014  0
2  8/30/2014  0
2  9/30/2014  0
2  10/30/2014 0
2  11/30/2014 0
2  12/30/2014 0
')

# 加载需要的工具包
library(dplyr)
library(lubridate)

# 把字符串日期转换成R可识别的日期格式
dt <- dt %>%
  mutate(Date = mdy(Date))  # mdy函数自动识别"月/日/年"格式的字符串

方法一:用dplyr + slider包(简洁直观)

slider包专门用于处理滑动窗口计算,语法清晰易懂,适合大多数常规场景:

library(slider)

dt_rolling <- dt %>%
  group_by(ID) %>%  # 按ID分组计算
  arrange(Date) %>%  # 确保每个ID内的日期按时间顺序排列
  mutate(
    rolling_3month_sum = slide_dbl(
      .x = Flag,  # 要计算求和的目标字段
      .f = sum,   # 窗口内的计算逻辑(求和)
      .before = months(3),  # 定义窗口范围:当前日期往前推3个月
      .complete = FALSE  # 允许窗口内不足3个月的情况(比如前几条早期记录)
    )
  ) %>%
  ungroup()

这样就能得到每个日期对应的3个月滚动求和结果!比如你提到的ID=1在2012-02-29的记录,rolling_3month_sum会是2,正好是该日期及之前3个月内的Flag总和。

方法二:用data.table包(适合大数据量)

如果你的数据集规模很大,data.table的运算效率会更高,用这种方式实现:

library(data.table)

# 转换为data.table格式
setDT(dt)
dt[, Date := mdy(Date)]
dt <- dt[order(ID, Date)]  # 按ID和日期排序

# 计算滚动求和
dt[, rolling_3month_sum := sapply(Date, function(x) {
  sum(Flag[Date >= x - months(3) & Date <= x])
}), by = ID]

这个方法的逻辑是:对每个ID,遍历每个日期,计算该日期往前3个月范围内的Flag总和,结果和第一种方法完全一致。

验证结果

你可以查看处理后的数据集,比如ID=1的前几条记录:

dt_rolling %>% filter(ID == 1) %>% select(ID, Date, Flag, rolling_3month_sum)

会看到:

IDDateFlagrolling_3month_sum
12012-01-3011
12012-02-2912
12012-03-3013
12012-04-3013

完全符合你的需求哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:03:13