我有一个为期两年的每日时间序列,我想从两个月宽的滑动窗口(即一月至二月、二月至三月……、十一月至十二月)之间提取最大值。我可以通过使用包
tidyverse
和 slider
来接近答案,但是,答案并不准确,因为并非所有月份都有相同的天数。有没有一种方法可以从两个月宽的滑动窗口中提取最大值,而不依赖于设置要查看之前和之后的天数值?
library(tidyverse)
library(slider)
# Example Daily Timeseries
set.seed(333)
df <- data.frame(
date = seq(as.Date('2020-01-01'),
as.Date('2021-12-31'),
'1 day'),
value = round(rnorm(731,100,33))
)
# Calculate maximum in 2-month (60-day) wide sliding window
# Must supply number of days before and after but months have different number of days
df %>%
mutate(two_month_max = slider::slide_index_dbl(value, date, max, .before = 30, .after = 30)) %>%
filter(day(date) == 1) %>%
select(!value)
#> date two_month_max
#> 1 2020-01-01 164
#> 2 2020-02-01 164
#> 3 2020-03-01 160
#> 4 2020-04-01 170
#> 5 2020-05-01 181
#> 6 2020-06-01 181
#> 7 2020-07-01 150
#> 8 2020-08-01 193
#> 9 2020-09-01 193
#> 10 2020-10-01 212
#> 11 2020-11-01 212
#> 12 2020-12-01 187
#> 13 2021-01-01 179
#> 14 2021-02-01 179
#> 15 2021-03-01 167
#> 16 2021-04-01 159
#> 17 2021-05-01 169
#> 18 2021-06-01 184
#> 19 2021-07-01 184
#> 20 2021-08-01 194
#> 21 2021-09-01 194
#> 22 2021-10-01 163
#> 23 2021-11-01 161
#> 24 2021-12-01 168
创建于 2024-05-08,使用 reprex v2.1.0
额外信息:我已将上面的输出格式化为类似于 厄尔尼诺/南方涛动 (ENSO) - 多元 ENSO 指数版本 2 (MEI),这些最大值将在其他时间附加到其中。
library(tidyverse)
library(rsoi)
# Import Multivariate ENSO Index Version 2 (MEI) ----
mei <- download_mei()
mei %>%
arrange(-desc(Date))
#> # A tibble: 552 × 5
#> Year Month Date MEI Phase
#> <int> <fct> <date> <dbl> <ord>
#> 1 1979 DJ 1979-01-01 0.47 Neutral Phase
#> 2 1979 JF 1979-02-01 0.29 Neutral Phase
#> 3 1979 FM 1979-03-01 -0.05 Neutral Phase
#> 4 1979 MA 1979-04-01 0.21 Neutral Phase
#> 5 1979 AM 1979-05-01 0.27 Neutral Phase
#> 6 1979 MJ 1979-06-01 -0.11 Neutral Phase
#> 7 1979 JJ 1979-07-01 -0.11 Neutral Phase
#> 8 1979 JA 1979-08-01 0.47 Neutral Phase
#> 9 1979 AS 1979-09-01 0.38 Neutral Phase
#> 10 1979 SO 1979-10-01 0.23 Neutral Phase
#> # ℹ 542 more rows
创建于 2024-05-08,使用 reprex v2.1.0
slide_index
的帮助有一个类似的例子,建议在这里应用:
df %>%
mutate(two_month_max = slider::slide_index_dbl(value, date,
~max(.x, na.rm = TRUE),
.before = ~.x %m-% months(1),
.after = ~.x %m+% months(1))) %>%
filter(day(date) == 1) %>%
select(!value)