使用 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
参数来决定当您没有完整的两年滚动到最大值时要在第一年和最后一年的数据中做什么。 (在你的例子中你只有两年,所以只有一天满足“每边一年”的规定)
slider
是 tidyverse
.
的一部分
试试这个:
library(dplyr)
library(slider)
df %>% mutate(two_years_max = slide_index_dbl(value, date, max, .before = 365, .after = 365))
这听起来像是一个愚蠢的问题,但我在网上找不到答案。我有一个大型数据集,如下所示:
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
参数来决定当您没有完整的两年滚动到最大值时要在第一年和最后一年的数据中做什么。 (在你的例子中你只有两年,所以只有一天满足“每边一年”的规定)
slider
是 tidyverse
.
试试这个:
library(dplyr)
library(slider)
df %>% mutate(two_years_max = slide_index_dbl(value, date, max, .before = 365, .after = 365))