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

