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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:45:43