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

R中如何用dplyr::mutate实现厄尔尼诺/拉尼娜气候条件判定

实现代码

你可以通过滑动窗口函数配合条件判断实现需求,完整代码如下:

library(dplyr)
library(fpp3)
# 如未安装slider包请先运行:install.packages("slider")
library(slider)

# 修正示例数据中的日期笔误(最后一个重复的2018-06改为2019-06)
dates <- yearmonth(c(
  "2018-02", 
  "2018-03",
  "2018-04",
  "2018-05", 
  "2018-06",
  "2018-07",      
  "2018-08", 
  "2018-09",
  "2018-10",
  "2018-11", 
  "2018-12",
  "2019-01",  
  "2019-02", 
  "2019-03",
  "2019-04",
  "2019-05", 
  "2019-06"
))

TMA <- c(
  -0.85,
  -0.69,
  -0.50,
  -0.22,
  -0.01,
  0.09,
  0.23,
  0.49,
  0.76,
  0.90,
  0.82,
  0.75,
  0.73,
  0.72,
  0.66,
  0.54,
  0.45 
)

df <- data.frame(dates, TMA)

df <- df %>%
  arrange(dates) %>% # 必须先按日期升序排列,保证时序计算正确
  mutate(
    `Climatic Condition` = case_when(
      # 判定厄尔尼诺:包含当前行在内的连续5个TMA均大于0.5
      slide_lgl(TMA, ~all(.x > 0.5), .before = 4, .complete = TRUE) ~ "El Niño",
      # 判定拉尼娜:包含当前行在内的连续5个TMA均小于-0.5
      slide_lgl(TMA, ~all(.x < -0.5), .before = 4, .complete = TRUE) ~ "La Niña",
      # 不满足条件则返回空值
      TRUE ~ NA_character_
    )
  )

如果你不想额外安装slider包,也可以直接用dplyr自带的lag函数实现,和你描述的「取前5行($TMA_{t-1}$到$TMA_{t-5}$)判定」的规则完全对应:

df <- df %>%
  arrange(dates) %>%
  mutate(
    `Climatic Condition` = case_when(
      lag(TMA,1) > 0.5 & lag(TMA,2) > 0.5 & lag(TMA,3) > 0.5 & lag(TMA,4) > 0.5 & lag(TMA,5) > 0.5 ~ "El Niño",
      lag(TMA,1) < -0.5 & lag(TMA,2) < -0.5 & lag(TMA,3) < -0.5 & lag(TMA,4) < -0.5 & lag(TMA,5) < -0.5 ~ "La Niña",
      TRUE ~ NA_character_
    )
  )

说明

  • slide_lgl的.complete = TRUE参数会自动把前4行(不足5个样本的行)赋值为NA,符合你的需求。
  • 你给出的示例数据中仅前两个TMA值小于-0.5,不满足连续5个的要求,不会触发拉尼娜标记;从2018年10月起TMA连续高于0.5,会在2019年2月及之后的对应行触发厄尔尼诺标记。

内容的提问来源于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.10.01 21:36:04