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

R语言按id分组计算变量3期滚动递归平均值的实现方法

原有代码的问题

你之前写的代码无法实现需求,核心错误有两点:

  • summarise()按id分组聚合后每个id仅返回1行结果,计算的是每个id最后3行的整体均值,并非逐行滚动计算
  • 合并后同一个id下所有行的v_1、v_2取值完全相同,和逐行滚动计算的要求完全不符
正确实现方案

使用slider包(tidyverse生态专门做滑动窗口计算的工具)实现最简洁,逻辑完全匹配你的计算规则:按id分组后,逐行取当前行+向前最多2行的范围计算均值,行数不足3行时自动按实际存在的行数计算。

# 首次使用请先运行 install.packages("slider") 安装包
library(dplyr)
library(slider)

final_data <- my_data %>%
  group_by(id) %>%
  mutate(
    v_1 = slide_dbl(var_1, mean, .before = 2, .after = 0),
    v_2 = slide_dbl(var_2, mean, .before = 2, .after = 0)
  ) %>%
  ungroup()

参数说明:

  • .before = 2:窗口包含当前行之前的2行数据
  • .after = 0:窗口不包含当前行之后的任何数据
  • 函数默认设置.complete = FALSE,窗口内行数不足3行时自动按实际存在的行计算均值,刚好匹配index=1、index=2等历史行数不足场景的计算要求。

无额外包依赖的备选方案

如果不想安装额外包,借助基础R和dplyr的行号定位逻辑也可以实现:

library(dplyr)

final_data <- my_data %>%
  group_by(id) %>%
  mutate(
    current_row = row_number(),
    v_1 = sapply(current_row, function(i) mean(var_1[max(1, i-2):i])),
    v_2 = sapply(current_row, function(i) mean(var_2[max(1, i-2):i]))
  ) %>%
  select(-current_row) %>%
  ungroup()
结果校验

以你给出的id=1的样例数据为例,v_1计算结果如下,完全符合规则:

  • index=1:仅取第1行var_1=0,v_1=0
  • index=2:取第1-2行var_1=c(0,0),v_1=0
  • index=3:取第1-3行var_1=c(0,0,1),v_1≈0.333
  • index=4:取第2-4行var_1=c(0,1,0),v_1≈0.333

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:30:54