在R中基于name_ex与rounds过滤实现分组滚动求和的技术问询
按分组计算滚动求和并基于累计值过滤
核心需求实现
先构造示例数据方便演示:
library(dplyr) library(zoo) set.seed(123) df <- tibble( name_ex = rep(c("A", "B"), each = 8), rounds = sample(1:3, 16, replace = TRUE), stat1 = rnorm(16), stat2 = rnorm(16) )
按name_ex分组,对stat1和stat2分别计算前3行的滚动求和(窗口大小3,包含当前行),确保分组数据完全隔离:
core_result <- df %>% group_by(name_ex) %>% mutate( # rollsumr 实现向右对齐的滚动求和,k=3表示取当前行及前2行的和 # fill=NA 保证分组内前2行因不足3行返回NA stat1_rollsum3 = rollsumr(stat1, k = 3, fill = NA), stat2_rollsum3 = rollsumr(stat2, k = 3, fill = NA) ) %>% ungroup()
进阶需求实现
基于rounds累计值在10-12区间的行,对stat1和stat2求和:
advanced_result <- df %>% group_by(name_ex) %>% mutate(rounds_cum = cumsum(rounds)) %>% # 计算每个分组内rounds的累计值 filter(between(rounds_cum, 10, 12)) %>% # 筛选累计值处于10-12的行 summarise( stat1_total = sum(stat1), stat2_total = sum(stat2), .groups = "drop" )
问题修正说明
- 之前未正确隔离分组数据:确保
group_by(name_ex)后所有计算(包括rollsumr)都在分组内执行,最后用ungroup()取消分组即可避免跨分组污染。 - 无法按累计值过滤:先通过
cumsum(rounds)计算分组内的累计值,再用between()筛选目标区间,最后汇总求和。
内容的提问来源于stack exchange,提问作者DonnyDolio
相关产品推荐
相关产品推荐

