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

如何在R中计算TOTAL列最近30年的同月(MoM)平均值?

30年同月均值计算实现方案

1. dplyr + slider 方案(推荐)

核心逻辑是按月份拆分分组后,在同月份组内滑动计算过往30年的均值,数据不足30年的时段自动返回NA。
首先加载依赖包、读取数据集:

library(dplyr)
library(slider)

ENSO <-read.table("http://www.cpc.ncep.noaa.gov/products/analysis_monitoring/ensostuff/detrend.nino34.ascii.txt", header = TRUE)

计算30年同月均值:

ENSO_result <- ENSO %>%
  # 按月份拆分分组,仅同月份数据参与计算
  group_by(MON) %>%
  # 组内按年份升序排序,保证滑动窗口取历史数据
  arrange(YR, .by_group = TRUE) %>%
  mutate(
    # 滑动窗口取当前行+前29行共30年数据计算均值,不足30行返回NA
    avg_30y_mom = slide_dbl(TOTAL, mean, .before = 29, .complete = TRUE)
  ) %>%
  ungroup()

验证2021年9月的计算结果:

ENSO_result %>%
  filter(YR == 2021, MON == 9) %>%
  pull(avg_30y_mom)

2. dplyr + zoo 方案

如果你更习惯用zoo包处理滑动计算,可以用如下代码,计算结果和slider方案完全一致:

library(dplyr)
library(zoo)

ENSO <-read.table("http://www.cpc.ncep.noaa.gov/products/analysis_monitoring/ensostuff/detrend.nino34.ascii.txt", header = TRUE)

ENSO_result <- ENSO %>%
  group_by(MON) %>%
  arrange(YR, .by_group = TRUE) %>%
  mutate(
    avg_30y_mom = rollapplyr(TOTAL, width = 30, FUN = mean, fill = NA)
  ) %>%
  ungroup()

内容的提问来源于stack exchange,提问作者Rodrigo H. Ozon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:27:01