r - 如何使用特定时间窗口调用函数?
问题描述
假设我有一个动物园对象(或者它可能是一个 data.frame),它在“一天中的时间”上有一个索引并且有一些值(见下面的示例数据):
val
...
2006-08-01 12:00 23
2006-08-01 12:01 24
2006-08-01 12:02 25
2006-08-01 12:03 26
2006-08-01 12:04 27
2006-08-01 12:05 28
2006-08-01 12:06 29
...
2006-08-02 12:00 123
2006-08-02 12:01 124
2006-08-02 12:02 125
2006-08-02 12:03 126
2006-08-02 12:04 127
...
我想custom.func(vals)
在 12:01 - 12:03 之间调用一个自定义函数(调用它)(即类似于 zoo::rollapply),每次间隔发生时,在这个例子中,每天。我该怎么做?
注意(为了稳健性,考虑以下边缘情况也很好,但不是必需的):
- 不要假设我每天都有 12:01 - 12:03 的值
- 不要假设每天都存在整个范围 12:01 - 12:03。有些日子我可能只有 12:01 和 12:02,但可能会错过 12:03
- 如果我希望我
custom.func(vals)
在一天的边界上被调用,比如使用val
从 23:58 到 00:12 怎么办?
解决方案
我推荐runner包,它允许计算不规则时间序列上的任何滚动函数。函数运行器等效于rollApply
它可以依赖于日期的区别。runner
允许在由k
日期idx
(或任何整数)定义的窗口长度上应用任何 R 函数。下面的示例计算 5 分钟(5*60 秒)窗口跨度的回归。算法不关心是否会有换日,每次只计算 5 分钟(例如 23:56-00:01)。
创建数据:
set.seed(1)
x <- cumsum(rnorm(1000))
y <- 3 * x + rnorm(1000)
time <- as.POSIXct(cumsum(sample(60:120, 1000, replace = TRUE)),
origin = Sys.Date()) # unequaly spaced time series
data <- data.frame(time, y, x)
要在滑动窗口上调用的自定义函数:
library(runner)
running_regression <- function(idx) {
predict(lm(y ~ x, data = data))[max(idx)]
}
data$pred <- runner(seq_along(x),
k = 60 * 5,
idx = time,
f = running_regression)
一旦我们创建了具有滚动 5 分钟预测的数据集,那么我们就可以只过滤特定的窗口——在这里,只有每小时的 1 分钟。这意味着我们总是保持 {hh}:56 - {hh+1}:01
library(dplyr)
library(lubridate)
filtered <-
data %>%
filter(minute(time) == 1)
plot(data$time, data$y, type = "l", col = "red")
points(filtered$time, filtered$pred, col = "blue")
小插图中还有一些其他示例如何使用runner
推荐阅读
- kubernetes - 如何在卷挂载中使用 pod 名称?
- python - 问题 - 处理后将文件写回本地系统
- html - IIS URL重写不附加查询字符串
- sql - Oracle/PL-SQl:将查询结果传递给另一个更新
- java - java语言中的字符串与字符串?
- python - 在 Windows 10 中双击运行 .py 文件
- stripe-payments - 如何在结帐前检查 Stripe 促销代码是否对产品有效
- jenkins-pipeline - odoo psycopg2.ProgrammingError:列 res_partner.field_name 不存在
- python-3.x - Python Pandas:按一列分组,仅在另一列中聚合,但取相应数据
- mysql - 我如何从大 mysql 表中获取每天的最后一行