如何在dplyr中使用lag()函数,实现排除前7行的滚动平均?
解决方案:用rollapplyr实现排除紧邻前7行的滚动平均
你需要的是计算滚动平均时跳过当前行紧邻的前7个观测,只使用再往前的28个数据点来计算均值。原代码的逻辑无法实现这个需求,通过调整rollapplyr的width参数可以精准指定窗口范围,达成目标。
修正后的代码
library(tidyverse) library(zoo) set.seed(123) # 设置随机种子,保证结果可复现 stack <- data.frame( date = seq(Sys.Date(), Sys.Date() - 99, -1), var1 = round(rnorm(100, 8000, 500)) ) # 计算排除紧邻前7行的28期滚动平均 stack <- stack %>% mutate( var1_roll_mean = rollapplyr( var1, width = list(-(8:35)), # 窗口为当前行往前第8到第35行,共28个观测 FUN = mean, partial = TRUE, # 窗口数据不足28个时,用现有数据计算均值(可根据需求关闭) fill = NA # 数据不足时填充NA ) )
关键参数说明
width = list(-(8:35)):这是实现需求的核心。负数索引代表相对当前位置的前置偏移,-(8:35)明确指定只取当前行之前第8到第35个观测,直接跳过了紧邻的前7行(第1到第7个前置数据),刚好覆盖28个数据点。- 如果需要调整窗口内的数据量,比如排除前7行后取最近的20个观测,只需把索引改成
-(8:(8+19))即可。 partial = TRUE:保留这个参数可以让窗口在数据不足28个时(比如前35行的观测),用现有可用数据计算均值;如果要求必须凑齐28个数据才计算,把它改成FALSE即可。
内容的提问来源于stack exchange,提问作者user13973103
相关产品推荐
相关产品推荐

