如何在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
相关产品推荐
相关产品推荐

