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

使用dplyr与RcppRoll计算多固定窗口平均值的技术问询

用dplyr和RcppRoll计算多窗口滚动平均值

没问题!我来帮你补全代码,实现针对storms数据集中每个风暴计算过去4、5、6个时间步长的滚动平均风速。这里我会用dplyr的现代语法(across替代旧版的mutate_at),同时保持代码清晰易读:

library(dplyr)
library(RcppRoll)
set.seed(1)

# 抽样4个风暴数据
storms <- storms[storms$name %in% sample(storms$name, size = 4),]

# 处理数据并计算多窗口滚动平均
storms_processed <- storms %>%
  # 保留需要的列
  select(name, year, month, day, hour, wind) %>%
  # 按风暴分组,确保每个风暴的计算独立
  group_by(name) %>%
  # 按时间排序,这一步非常关键,滚动计算必须基于有序的时间序列
  arrange(name, year, month, day, hour) %>%
  # 计算不同窗口的滚动平均风速
  mutate(
    # 过去4个时间步长的平均(包含当前行)
    wind_roll_avg_4 = roll_mean(wind, n = 4, align = "right", fill = NA),
    # 过去5个时间步长的平均
    wind_roll_avg_5 = roll_mean(wind, n = 5, align = "right", fill = NA),
    # 过去6个时间步长的平均
    wind_roll_avg_6 = roll_mean(wind, n = 6, align = "right", fill = NA)
  )

# 查看前10行结果
head(storms_processed, 10)

代码关键说明

  • 分组与排序:group_by(name)保证每个风暴的滚动计算不会和其他风暴的数据混合;arrange步骤必须确保每个组内的时间是严格递增的,否则滚动平均的结果会完全错误。
  • 滚动平均参数:
    • n:设置窗口大小,对应你需要的4、5、6个时间步长;
    • align = "right":表示窗口以当前行作为终点(即计算当前行及之前n-1行的平均值,也就是“过去n个时间步长包含当前”)。如果你的需求是不包含当前行的过去n个时间步长,可以把align改为"left",或者调整窗口偏移;
    • fill = NA:当窗口不足时(比如前3行对于n=4的窗口),用NA填充,避免抛出错误。

兼容旧版dplyr的写法(用mutate_at)

如果你习惯使用旧版的mutate_at语法,也可以这样写:

storms_processed_old <- storms %>%
  select(name, year, month, day, hour, wind) %>%
  group_by(name) %>%
  arrange(name, year, month, day, hour) %>%
  mutate_at("wind", list(
    roll_avg_4 = ~roll_mean(., n = 4, align = "right", fill = NA),
    roll_avg_5 = ~roll_mean(., n = 5, align = "right", fill = NA),
    roll_avg_6 = ~roll_mean(., n = 6, align = "right", fill = NA)
  ))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:53:08