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

在R语言中按分组提取滚动均值最大值对应的元素组

分组数据滚动均值最大值定位方案

以下是基于dplyr和zoo包实现需求的完整代码步骤,解决分组内滚动均值最大值的定位问题:

1. 加载依赖包

library(dplyr)
library(zoo)
library(tidyr) # 用于数据格式转换

2. 构造测试数据

先创建包含group和value列的示例数据框,方便验证逻辑:

set.seed(123) # 设置随机种子保证结果可复现
df <- tibble(
  group = rep(c("A", "B"), each = 5),
  value = c(rnorm(5, 10, 2), rnorm(5, 8, 1.5))
)

3. 生成多窗口滚动均值列

通过rollapplyr生成指定窗口大小的滚动均值列(示例为窗口1到3,可根据需求调整):

df_roll <- df %>%
  group_by(group) %>%
  mutate(
    roll1 = rollapplyr(value, 1, mean, fill = NA), # 窗口1的均值即原始值
    roll2 = rollapplyr(value, 2, mean, fill = NA), # 最近2个值的均值
    roll3 = rollapplyr(value, 3, mean, fill = NA)  # 最近3个值的均值
  ) %>%
  ungroup()

4. 统计分组内各窗口的最大滚动均值

将宽格式数据转为长格式,方便按分组和窗口维度统计最大值及对应位置:

# 统计每个分组、每个窗口的最大滚动均值及对应原始值区间
roll_max_stats <- df_roll %>%
  pivot_longer(
    cols = starts_with("roll"), 
    names_to = "window", 
    values_to = "roll_mean"
  ) %>%
  mutate(window = as.numeric(sub("roll", "", window))) %>% # 提取窗口数值
  group_by(group, window) %>%
  summarize(
    max_roll_mean = max(roll_mean, na.rm = TRUE),
    start_row = which.max(roll_mean), # 最大值首次出现的行号(分组内)
    # 计算对应的原始值连续区间
    value_interval = ifelse(
      !is.na(start_row),
      paste(start_row, "to", start_row + window - 1),
      NA_character_
    )
  ) %>%
  ungroup()

5. 定位分组内全局最大滚动均值(可选)

如果需要找到每个分组中所有窗口里最大的滚动均值,可进一步处理:

global_max_stats <- roll_max_stats %>%
  group_by(group) %>%
  slice_max(max_roll_mean, n = 1) %>% # 取每组最大的滚动均值记录
  ungroup()

关键说明

  • 之前使用which.max失败,大概率是因为未在分组内单独处理,或直接在宽格式下跨列使用导致逻辑错误;转长格式后按group和window分组,which.max可准确定位分组内当前窗口的最大值位置。
  • 参数fill = NA保留滚动均值计算时的缺失值,符合需求中"NA位置不影响结果"的要求,统计时通过na.rm = TRUE忽略缺失值即可。

内容的提问来源于stack exchange,提问作者Vinicius B. de S. Moreira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:55:23