计算循环滑动30天平均温度:年末观测值处理难题
优雅解决跨年度循环的30天滑动平均问题
核心思路
解决年末最后30天的循环滑动平均问题,最优雅的方式是构造循环扩展数据集——将原数据的前N行(N=窗口大小-1)追加到原数据末尾,这样直接用滑动窗口函数就能自然处理跨年初的情况,无需分条件判断。
解决方案代码
library(dplyr) library(zoo) # 生成可复现的示例数据 set.seed(123) temp_data = tibble( day_year = c(1:366), temp = rnorm(366, 5, 2) ) # 构造循环扩展数据:追加前29天数据(30天窗口需补29天) extended_temp = bind_rows(temp_data, slice(temp_data, 1:29)) # 计算「当前日期开始的连续30天」平均温度 temp_data = temp_data %>% mutate( temp_next_30d = rollapply( extended_temp$temp, width = 30, FUN = mean, align = "left", # 窗口从当前位置向右取30个值 fill = NA )[1:366] # 仅保留原数据对应的结果 )
需求调整:若「之后30天」不包含当前日期
如果需要计算当前日期之后的30天(不含当日),只需调整滑动窗口的取值范围:
temp_data = temp_data %>% mutate( temp_next_30d = rollapply( extended_temp$temp, width = 30, FUN = mean, align = "left" )[2:367] # 取扩展数据的第2到367个结果,对应原数据当日的下一天开始的30天 )
原代码问题分析
- 下标错误:当
day_year < 336时,day_year - 335为负数,1:(day_year-335)会生成正负数混合的下标,R不允许这种操作,因此报错。 - 逻辑错误:即使取绝对值,原代码中将两部分的平均值相加而非求整体平均值,结果完全错误;且分条件判断的写法繁琐,容易出现边界值错误。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

