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

