如何基于历史日期窗口计算均值?(R语言tibble场景)
基于日期滑动窗口计算分组均值的实现
原始数据
首先给出待处理的tibble数据框(已修正原代码中make_date的参数错误):
library(tibble) library(lubridate) df <- tribble( ~dt, ~value, make_date(2023,08,01),1, make_date(2023,08,02),2, make_date(2023,08,04),3, make_date(2023,08,07),4, make_date(2023,08,08),5, make_date(2023,08,09),6, make_date(2023,08,10),7, make_date(2023,08,11),8, make_date(2023,08,12),9 )
需求说明
为数据框新增avg列,规则如下:
- 对每条记录,计算其
dt日期前3天范围内(即区间[dt - 3天, dt - 1天])的value均值,忽略NA值 - 日期可能存在任意间隔,实际场景需支持按
subject_id分组计算 - 窗口大小(如示例中的3天)需支持灵活调整
解决方案
使用slider包的滑动窗口函数可高效实现需求,同时支持分组和自定义窗口大小:
1. 加载所需包
library(dplyr) library(slider) library(lubridate)
2. 核心代码实现
# 定义窗口大小(可按需调整,示例为3天) window_days <- 3 # 计算滑动均值(需分组则添加group_by(subject_id)) df_result <- df %>% group_by() %>% mutate( avg = slide_dbl( .x = value, .i = dt, .f = ~mean(.x, na.rm = TRUE), .before = window_days - 1, # 取当前日期前window_days天的范围 .complete = FALSE # 窗口无数据时返回NA ) ) %>% ungroup()
3. 结果验证
运行后得到与目标一致的结果:
df_result #> # A tibble: 9 × 3 #> dt value avg #> <date> <dbl> <dbl> #> 1 2023-08-01 1 NA #> 2 2023-08-02 2 1 #> 3 2023-08-04 3 1.5 #> 4 2023-08-07 4 3 #> 5 2023-08-08 5 4 #> 6 2023-08-09 6 4.5 #> 7 2023-08-10 7 5 #> 8 2023-08-11 8 6 #> 9 2023-08-12 9 7
代码说明
slide_dbl通过.i = dt绑定日期索引,确保日期有间隔时仍能准确匹配时间范围.before = window_days - 1精准对应“前N天”的区间要求,调整window_days即可修改窗口大小- 需按
subject_id分组时,只需在group_by()中加入该字段即可
内容的提问来源于stack exchange,提问作者Peter Rabinovitch
相关产品推荐
相关产品推荐

