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

