我正在尝试使用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中的数据帧中,我们可以这样做:
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中的变异?
发布于 2021-10-02 13:25:43
您可以使用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发布于 2021-10-02 13:12:40
你可以使用
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还有更复杂的方法,但这是一种简单的方法。
发布于 2021-10-02 19:06:29
我们可以使用来自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ñohttps://stackoverflow.com/questions/69417142
复制相似问题