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

R语言dplyr分组计算指定偏移前值的滚动均值实现方法

R语言分组计算指定滞后位置滚动均值的实现方案

需求梳理

  • 测试数据构造代码:
set.seed(12)
df <- data.frame(id = sample(1:50,50), Gp = sample(2, 50, TRUE)) 
  • 处理规则:
    • 按Gp字段分组计算
    • 右对齐计算,无有效取值的位置填充NA
    • 每行取组内当前行之前第10、11、12位共3个id值计算均值,再用当前行id减去该均值,结果存为新列rm
    • 优先使用dplyr生态实现
  • 原有代码问题:直接调用rollmeanr(id,k = 3, fill = NA)仅能计算当前行及紧邻前2行的均值,窗口没有做指定偏移,不符合滞后位置要求。

实现代码

搭配zoo包提供的滚动均值函数(和原有代码依赖的rollmeanr来源一致),通过lag()先将序列偏移10位,再做k=3的右对齐滚动均值,刚好覆盖需要的3个滞后位置,无需手动拼接多个lag()调用:

library(dplyr)
library(zoo)

df2 <- df %>% 
  group_by(Gp) %>%
  mutate(rm = id - rollmeanr(lag(id, 10), k = 3, fill = NA)) %>%
  ungroup()

逻辑说明

  • 分组后lag(id, 10)会将组内id序列整体向后偏移10位,组内前10行该值自动填充为NA
  • 对偏移后的序列调用rollmeanr(..., k=3, fill=NA)做右对齐滚动计算,此时当前行位置的滚动均值,刚好对应原序列组内当前行前第10、11、12位三个值的算术平均:

    偏移后序列的窗口取值为[i-2, i-1, i],对应原序列位置为[i-2-10, i-1-10, i-10] = [i-12, i-11, i-10],完全匹配取值要求

  • 组内前12行因为凑不齐3个有效滞后值,会自动填充NA,符合右对齐填充规则
  • 如果需要按全局行序(不分组)计算,直接删除代码中group_by(Gp)和ungroup()即可,和举例的全局行15的计算逻辑完全一致(示例中结果-12是笔误将row4的id值13写为12导致,代码计算逻辑完全匹配规则)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:39:38