r - 查找时间序列中的历史最大值
问题描述
我正在尝试从时间序列数据中识别历史最大记录。我只需要识别与该点之前的数据有关的最大记录,而不是整个向量。
一个例子:
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 的做事方式。
任何人都可以帮忙吗?我想这很容易。
解决方案
一个选项是获取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
推荐阅读
- android - Android NDK (libgcc_real.a) 上“__aeabi_ul2f”的多重定义
- azure-devops - 在 azure devops 模板中打印模板参数
- batch-file - 根据部分文件名将文件移动到目录
- javascript - 具有作为类实例的键的对象的 JSDoc
- java - 从 C++ 读取的文件不起作用,但它在 android 的 JAVA 中起作用。为什么?
- python - 使用 Selenium Python 访问 Facebook 元素但出现错误的简单程序
- python - 在看不见的数据点上使用 category_encoders.TargetEncoder()
- c++ - 使用windbg调试内存泄漏时获取堆栈跟踪
- rest - octokit-rest node-js:授权用户名和密码获取“传递给 createTokenAuth 的令牌不是字符串”错误
- javascript - React 功能组件 - 如何从内部删除组件?