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

R语言如何对多字段分组后的每组数据分别应用自定义滑动求和函数

问题原因

你之前的改写存在两个核心问题:

  1. collapse::flag默认会对输入数据框的所有列执行平移操作,你直接传入整表会将分组列、标记列(Thumb)也纳入计算,逻辑完全不符合预期
  2. 原函数末尾减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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:45:06