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

R语言基于tidyverse/slider实现分组滑动窗口均值简洁计算

R语言分组固定窗口滑动均值实现方案

你已经在使用tidyverse和slider包,不需要手动逐次筛选窗口、拼接结果,直接利用slider的滑动计算函数配合dplyr分组操作即可简洁实现需求。

完整实现代码

library(tidyverse)
library(slider)

# 读取示例数据(即提供的dput结果)
example <- structure(list(a = c("a", "a", "a", "a", "a", "a", "a", "b", 
"b", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c", "c", "c", 
"d", "d", "d", "d", "d", "d", "d"), b = c(0.199394755531102, 
0.711478831479326, 0.505893802503124, 0.0233104680664837, 0.994404575554654, 
0.092042422387749, 0.0632751111406833, 0.208315970376134, 0.535682428395376, 
0.95367618277669, 0.960666978731751, 0.498914737952873, 0.930273110279813, 
0.729706238722429, 0.248024080879986, 0.411097032949328, 0.235628247493878, 
0.801356019219384, 0.921010897262022, 0.0789776453748345, 0.887602533679456, 
0.137188882334158, 0.454170317854732, 0.92619909462519, 0.556802915409207, 
0.396265675779432, 0.345948834205046, 0.904526130529121), order = c(1, 
2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 
2, 3, 4, 5, 6, 7)), class = c("grouped_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -28L), groups = structure(list(
    a = c("a", "b", "c", "d"), .rows = structure(list(1:7, 8:14, 
        15:21, 22:28), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -4L), .drop = TRUE))

# 计算分组滑动窗口均值
res <- example %>%
  # 先按分组、order排序,避免行顺序错乱导致窗口取值错误
  arrange(a, order) %>%
  group_by(a) %>%
  mutate(
    bmean = slide_dbl(
      .x = b,
      .f = ~ mean(.x),
      .before = 4, # 当前行向前取4行,加当前行共5个元素
      .after = 0,
      .complete = TRUE # 仅当窗口凑满5个元素时才计算均值,否则返回NA
    )
  ) %>%
  # 过滤掉窗口不完整的行,保留需要的列
  filter(!is.na(bmean)) %>%
  select(a, bmean) %>%
  ungroup()

参数说明与结果验证

  • 每个分组共7行数据,固定窗口大小为5时,每个分组会生成3个有效连续窗口(行1-5、行2-6、行3-7),4个分组共返回12行结果,其中a组的计算值和给出的预期输出完全匹配:
> res
# A tibble: 12 × 2
   a     bmean
   <chr> <dbl>
 1 a     0.487
 2 a     0.465
 3 a     0.336
 4 b     0.631
 5 b     0.776
 6 b     0.815
 7 c     0.523
 8 c     0.490
 9 c     0.585
10 d     0.494
11 d     0.536
12 d     0.626
  • 如果需要调整窗口逻辑,可以直接修改slide_dbl的参数:
    • 要做居中滑动窗口,把.before = 2, .after = 2即可
    • 要调整滑动步长,增加.step参数设置步长值
    • 要计算其他统计量(比如中位数、标准差),直接替换.f对应的函数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:45:38