使用 R 中的 dplyr 查找日期范围内的最大值

Find the maximum value within a range of dates with dplyr in R

这听起来像是一个愚蠢的问题,但我在网上找不到答案。我有一个大型数据集,如下所示:

set.seed(1)
df <- data.frame(date = as.Date("2010-01-01")+seq(0,729), value = rnorm(730)) 

我想使用 dplyr 找出每个日期 1 年 window(加/减)内的滚动最大值。例如,对于日期“2010-05-01”,我想在“2009-05-01”和“2011-05-01”中找到最大值。 max_value 应该在 df 的新列中。谢谢。

这可能是您要查找的内容:

library(tidyverse)
set.seed(1)
df <- data.frame(date = as.Date("2010-01-01")+seq(0,729), value = rnorm(730)) 

df %>% as_tibble() %>%
  dplyr::mutate(previous = max(lag(value, order_by = date,n = 365), na.rm = T),
                nexts = max(lead(value, order_by = date,n = 365), na.rm = T),
                max_value = max(previous, nexts)) 
#> # A tibble: 730 x 5
#>    date        value previous nexts max_value
#>    <date>      <dbl>    <dbl> <dbl>     <dbl>
#>  1 2010-01-01 -0.626     2.65  3.81      3.81
#>  2 2010-01-02  0.184     2.65  3.81      3.81
#>  3 2010-01-03 -0.836     2.65  3.81      3.81
#>  4 2010-01-04  1.60      2.65  3.81      3.81
#>  5 2010-01-05  0.330     2.65  3.81      3.81
#>  6 2010-01-06 -0.820     2.65  3.81      3.81
#>  7 2010-01-07  0.487     2.65  3.81      3.81
#>  8 2010-01-08  0.738     2.65  3.81      3.81
#>  9 2010-01-09  0.576     2.65  3.81      3.81
#> 10 2010-01-10 -0.305     2.65  3.81      3.81
#> # ... with 720 more rows

reprex package (v0.3.0)

于 2020-08-20 创建

不是最优雅的,但它会工作。

set.seed(1)
df <- data.frame(date = as.Date("2010-01-01")+seq(0,729), value = rnorm(730)) 

for(i in 1:nrow(df)){
  tmp <- df %>%
    filter(date >= df[i,'date'] - 365, date <= df[i,'date'] + 365) %>% 
    summarise(value = max(value)) %>%
    pull()
  
  df[i,'max_value'] <- tmp
}

        date      value max_value
1 2010-01-01 -0.6264538  2.649167
2 2010-01-02  0.1836433  2.649167
3 2010-01-03 -0.8356286  2.649167
4 2010-01-04  1.5952808  2.649167
5 2010-01-05  0.3295078  2.649167
6 2010-01-06 -0.8204684  2.649167

您可以使用 zoo::rollmax:

df %>% 
  mutate(rollmax = zoo::rollmax(value, 720, align = "center", 
                                fill = c("extend", NA, "extend")))

您可以更改 fill 参数来决定当您没有完整的两年滚动到最大值时要在第一年和最后一年的数据中做什么。 (在你的例子中你只有两年,所以只有一天满足“每边一年”的规定)

slidertidyverse.

的一部分

试试这个:

library(dplyr)
library(slider)
df %>% mutate(two_years_max = slide_index_dbl(value, date, max, .before = 365, .after = 365))