【问题标题】:Cond. formula if the sequence of the last five lines is > 0.5 then "El Niño" and if the last five consecutive lines are < -0.5 then "La Niña" R条件。公式如果最后五行的序列> 0.5,则为“厄尔尼诺”,如果最后五行的序列< -0.5,则为“拉尼娜” R
【发布时间】:2021-11-23 18:23:52
【问题描述】:

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

规则决定是:

如果 $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{“厄尔尼诺”} $

否则

$TMA_{t-1}

如果以上都没有发生,则留空。

我们有更具体的:

如果最近 5 次连续 TMA > 0.5 发生,则为“厄尔尼诺”,否则如果最近 5 次连续 TMA

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

Excel formula for rule of decision characterization

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

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

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 中完成 Climatic Conditioninside dplyr::mutate ?

【问题讨论】:

  • 或者也许以另一种方式,不一定使用dplyr ...

标签: r vector rows dplyr


【解决方案1】:

你可以使用

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")
    )

返回

        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

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

      我们可以使用data.table中的shift

      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
      

      【讨论】:

        猜你喜欢
        • 2021-02-08
        • 2012-01-29
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-20
        • 1970-01-01
        • 2013-06-06
        相关资源
        最近更新 更多