双月滑动窗口的最大值

问题描述 投票:0回答:1

我有一个为期两年的每日时间序列,我想从两个月宽的滑动窗口(即一月至二月、二月至三月……、十一月至十二月)之间提取最大值。我可以通过使用包

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

r dplyr
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)
© www.soinside.com 2019 - 2024. All rights reserved.