如何在R中结合dplyr的mutate与rollapplyr批量生成多列?
批量生成滚动均值列(dplyr + rollapplyr)
核心思路
通过purrr::map()批量处理不同窗口大小的滚动计算,结合非标准求值语法!!!将结果转化为dplyr的多列输出,同时完美兼容group_by()分组计算逻辑。
代码实现
1. 基础无分组场景
library(dplyr) library(zoo) library(purrr) # 构造示例数据 df <- data.frame(Vazao = seq(1, 100)) # 定义需要的滚动窗口大小(可按需调整,比如1:10生成10列) window_sizes <- 1:5 # 批量生成滚动均值列 df2 <- df %>% mutate( !!!set_names( map(window_sizes, ~rollapplyr(Vazao, .x, mean, fill = NA, na.rm = TRUE, partial = FALSE)), paste0("roll", window_sizes) ) ) # 查看结果 head(df2)
2. 分组场景(兼容group_by)
如果需要按分组计算滚动均值,只需在mutate()前加入group_by()即可:
# 构造带分组的示例数据 df_grouped <- data.frame( Grupo = rep(c("A", "B"), each = 50), Vazao = seq(1, 100) ) # 分组批量生成滚动均值列 df_grouped_result <- df_grouped %>% group_by(Grupo) %>% mutate( !!!set_names( map(window_sizes, ~rollapplyr(Vazao, .x, mean, fill = NA, na.rm = TRUE, partial = FALSE)), paste0("roll", window_sizes) ) ) %>% ungroup() # 查看分组结果 head(df_grouped_result)
关键说明
window_sizes:一次性定义所有需要的滚动窗口大小,无需手动逐个编写roll1到rollN。map():遍历每个窗口大小,执行rollapplyr计算,返回结果列表。set_names():给列表中的每个结果向量命名为roll1、roll2...,对应最终生成的列名。!!!:将命名后的列表展开为mutate()的多个参数,实现批量列生成。- 分组支持:
group_by()后,每个分组会独立计算各自的滚动均值,完全符合dplyr的分组逻辑。
内容的提问来源于stack exchange,提问作者Vinicius B. de S. Moreira
相关产品推荐
相关产品推荐

