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
相关产品推荐
相关产品推荐

