首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件公式如果最后五条线的序列> 0.5,则“厄尔尼诺现象”,如果最后五条连续线< -0.5,则“拉尼娜”R

条件公式如果最后五条线的序列> 0.5,则“厄尔尼诺现象”,如果最后五条连续线< -0.5,则“拉尼娜”R
EN

Stack Overflow用户
提问于 2021-10-02 13:00:45
回答 3查看 38关注 0票数 0

我正在尝试使用dplyr::mutate in R来获得一个公式,以显示我的数据框中是否存在厄尔尼诺现象或拉尼娜现象。

规则决定是:

If $TMA_{t-1} > 0.5,,\mbox{and},,TMA_{t-2} > 0.5 \mbox{and},,TMA_{t-3} > 0.5 \mbox{and},,TMA_{t-4} > 0.5 \mbox{and},,TMA_{t-5} > 0.5 \mbox{then},,\mbox{"El Niño"} $

否则如果

和{t-1}< -0.5,,\mbox{和},,TMA_{t-2} < -0.5 \mbox{和},,TMA_{t-3} < -0.5 \mbox{和},,TMA_{t-4} < -0.5 \mbox{和},,TMA_{t-5} < -0.5 \mbox{then},,\mbox{“拉尼娜”}$

否则,如果上述情况都没有发生,则留空。

更具体的是,我们有:

如果最近5次连续出现TMA > 0.5,则为“厄尔尼诺现象”,否则,如果最后5次连续发生TMA < -0.5,则为“拉尼娜”。如果以上任何可能性都未选中,则将其留空(例如,NA或NULL )

这是我的问题的一个小视图,我在电子表格中创建了解决方案:

Excel formula for rule of decision characterization

葡萄牙语=SE(E means =IF(AND ...

在R中的数据帧中,我们可以这样做:

代码语言:javascript
复制
library(dplyr)
library(fpp3)

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", 
       "2018-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 %>%
  mutate(
    ´Climatic Condition´= 
            # The conditional statement that I had wrote above... (HELP!)
            )

我如何在R中完成dplyr::Climatic Condition中的变异?

EN

回答 3

Stack Overflow用户

发布于 2021-10-02 13:25:43

您可以使用zoo的滚动操作。

代码语言:javascript
复制
library(dplyr)
library(zoo)

df %>%
  mutate(climatic_condition = lag(case_when(
             rollapplyr(TMA < -0.5, 5, all, fill = FALSE) ~ "La Niña", 
             rollapplyr(TMA >  0.5, 5, all, fill = FALSE) ~ "El Niño")
         ))

#      dates   TMA climatic_condition
#1  2018 Feb -0.85               <NA>
#2  2018 Mar -0.69               <NA>
#3  2018 Apr -0.50               <NA>
#4  2018 May -0.22               <NA>
#5  2018 Jun -0.01               <NA>
#6  2018 Jul  0.09               <NA>
#7  2018 Aug  0.23               <NA>
#8  2018 Sep  0.49               <NA>
#9  2018 Oct  0.76               <NA>
#10 2018 Nov  0.90               <NA>
#11 2018 Dec  0.82               <NA>
#12 2019 Jan  0.75               <NA>
#13 2019 Feb  0.73               <NA>
#14 2019 Mar  0.72            El Niño
#15 2019 Apr  0.66            El Niño
#16 2019 May  0.54            El Niño
#17 2018 Jun  0.45            El Niño
票数 1
EN

Stack Overflow用户

发布于 2021-10-02 13:12:40

你可以使用

代码语言:javascript
复制
library(dplyr)

df %>% 
  mutate(condition = case_when(
    lag(TMA) > 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) < -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")
    )

这将返回

代码语言:javascript
复制
        dates   TMA condition
1  2018-02-01 -0.85      <NA>
2  2018-03-01 -0.69      <NA>
3  2018-04-01 -0.50      <NA>
4  2018-05-01 -0.22      <NA>
5  2018-06-01 -0.01      <NA>
6  2018-07-01  0.09      <NA>
7  2018-08-01  0.23      <NA>
8  2018-09-01  0.49      <NA>
9  2018-10-01  0.76      <NA>
10 2018-11-01  0.90      <NA>
11 2018-12-01  0.82      <NA>
12 2019-01-01  0.75      <NA>
13 2019-02-01  0.73      <NA>
14 2019-03-01  0.72   El Niño
15 2019-04-01  0.66   El Niño
16 2019-05-01  0.54   El Niño
17 2018-06-01  0.45   El Niño

还有更复杂的方法,但这是一种简单的方法。

票数 0
EN

Stack Overflow用户

发布于 2021-10-02 19:06:29

我们可以使用来自data.tableshift

代码语言:javascript
复制
library(dplyr)
library(data.table)
library(purrr)
df %>% 
   mutate(condition = case_when(map(shift(TMA, n = 1:5), ~ .x > 0.5) %>% 
       reduce(`&`) ~ "El Niño", 
    map(shift(TMA, n = 1:5), ~ .x < -0.5) %>% 
       reduce(`&`) ~ "La Niño"))
      dates   TMA condition
1  2018 Feb -0.85      <NA>
2  2018 Mar -0.69      <NA>
3  2018 Apr -0.50      <NA>
4  2018 May -0.22      <NA>
5  2018 Jun -0.01      <NA>
6  2018 Jul  0.09      <NA>
7  2018 Aug  0.23      <NA>
8  2018 Sep  0.49      <NA>
9  2018 Oct  0.76      <NA>
10 2018 Nov  0.90      <NA>
11 2018 Dec  0.82      <NA>
12 2019 Jan  0.75      <NA>
13 2019 Feb  0.73      <NA>
14 2019 Mar  0.72   El Niño
15 2019 Apr  0.66   El Niño
16 2019 May  0.54   El Niño
17 2018 Jun  0.45   El Niño
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69417142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档