首页 > 解决方案 > 查找时间序列中的历史最大值

问题描述

我正在尝试从时间序列数据中识别历史最大记录。我只需要识别与该点之前的数据有关的最大记录,而不是整个向量。

一个例子:

set.seed(431)
df <- data.frame(time = c(1:10), value = runif(10, 1, 10))

df
   time    value
1     1 7.758703
2     2 6.262849
3     3 8.281712
4     4 8.243617
5     5 6.781752
6     6 2.078103
7     7 4.455353
8     8 1.339119
9     9 3.635554
10   10 9.084619

我想要做的是生成一个向量,该向量可以识别以下创纪录的高数字在时间上向前移动:

   time    value record
1     1 7.758703    yes
2     2 6.262849     no
3     3 8.281712    yes
4     4 8.243617     no
5     5 6.781752     no
6     6 2.078103     no
7     7 4.455353     no
8     8 1.339119     no
9     9 3.635554     no
10   10 9.084619    yes

时间 1 的值是一个记录,因为在此之前没有值存在,因此它是最大值。时间 3 的项目是记录,因为它高于时间 1。时间 10 的值是记录,因为它高于时间 3。

我所能做的就是测试整个向量的最大值(即识别时间 10 的值),而不是直到所考虑的时间值的向量。我试图通过 dplyr 进行变异,但它不起作用。然后我考虑编写一个 for 循环,它将值附加到向量并在该新向量中查找最大值。这导致我发帖暗示这是一种比 R 更 Pythonic 的做事方式。

任何人都可以帮忙吗?我想这很容易。

标签: rtime-series

解决方案


一个选项是获取cummax'value',检查它是否等于'value'

library(dplyr)
df %>% 
    mutate(record = c('no', 'yes')[(value == cummax(value)) + 1])

# A tibble: 10 x 3
#    time value record
#   <int> <dbl> <chr> 
# 1     1  7.76 yes   
# 2     2  6.26 no    
# 3     3  8.28 yes   
# 4     4  8.24 no    
# 5     5  6.78 no    
# 6     6  2.08 no    
# 7     7  4.46 no    
# 8     8  1.34 no    
# 9     9  3.64 no    
#10    10  9.08 yes   

推荐阅读