如何计算各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)
会看到:
| ID | Date | Flag | rolling_3month_sum |
|---|---|---|---|
| 1 | 2012-01-30 | 1 | 1 |
| 1 | 2012-02-29 | 1 | 2 |
| 1 | 2012-03-30 | 1 | 3 |
| 1 | 2012-04-30 | 1 | 3 |
完全符合你的需求哦!
内容的提问来源于stack exchange,提问作者Ujjawal Bhandari
相关产品推荐
相关产品推荐

