R语言如何对多字段分组后的每组数据分别应用自定义滑动求和函数
问题原因
你之前的改写存在两个核心问题:
collapse::flag默认会对输入数据框的所有列执行平移操作,你直接传入整表会将分组列、标记列(Thumb)也纳入计算,逻辑完全不符合预期- 原函数末尾减1的逻辑是针对仅对
Thats单列计算的场景,多列输入时这个操作会得到错误结果
通用解决方案
我们将函数改造成针对单列数值向量的滑动求和工具,配合dplyr的分组机制即可适配任意分组数量、任意数值列的场景:
第一步:加载依赖包
library(dplyr) library(collapse)
第二步:定义通用滑动求和函数
# 参数说明: # x: 待计算的数值向量(比如示例中的Index列) # n: 窗口半长,即取当前行前后各n行求和(总长度2n+1) f <- function(x, n) { collapse::flag(x, -n:n) %>% rowSums(na.rm = TRUE) }
第三步:按分组执行计算
result <- dat %>% # 可自由添加更多分组字段 group_by(sub, trial) %>% mutate( gap1 = f(Index, 1), gap2 = f(Index, 2), gap3 = f(Index, 3), gap4 = f(Index, 4), gap5 = f(Index, 5) ) %>% ungroup() %>% # 筛选标记列为1的行 filter(Thumb == 1)
多列扩展写法
如果需要对多个数值列(比如同时有Index、Middle、Ring等列)计算滑动和,可使用across批量处理:
result <- dat %>% group_by(sub, trial) %>% mutate( across(c(Index, Middle, Ring), list(gap1 = ~f(.x, 1), gap2 = ~f(.x, 2), gap3 = ~f(.x, 3)), .names = "{.col}_{.fn}") ) %>% ungroup() %>% filter(Thumb == 1)
内容的提问来源于stack exchange,提问作者piravi
相关产品推荐
相关产品推荐

