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

