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

计算循环滑动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天
  )

原代码问题分析

  1. 下标错误:当day_year < 336时,day_year - 335为负数,1:(day_year-335)会生成正负数混合的下标,R不允许这种操作,因此报错。
  2. 逻辑错误:即使取绝对值,原代码中将两部分的平均值相加而非求整体平均值,结果完全错误;且分条件判断的写法繁琐,容易出现边界值错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:56:31