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

如何基于历史日期窗口计算均值?(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:06:29