首先,一个可重复的数据集:
library(zoo)
set.seed(0)
nSamples <- 5000
vecDT <- rexp(nSamples, 3)
vecTimes <- cumsum(c(0,vecDT))
vecDrift <- c(0, rnorm(nSamples, mean = 1/nSamples, sd = 0.01))
vecVals <- cumsum(vecDrift)
vecZ <- zoo(vecVals, order.by = vecTimes)
rm(vecDT, vecDrift)
假设时间单位为秒。在
vecZ
序列中,有将近 1700 秒(略少于30分钟)的时间,期间有5001个条目。(注:我会尝试使用 xts
,但是它似乎需要日期信息,而当不相关时,我宁愿不使用特定日期。)我的目标如下:
找到每个点前后3分钟的值的索引。由于时间是连续的,我怀疑任何两个点都精确地相隔3分钟。我想要找到的是在给定点之前不超过3分钟,在至少3分钟之后的点,即类似以下伪代码的内容:
backIX(t, vecZ, tDelta) = min{ix in length(vecZ) : t - time(ix) < tDelta}
forwardIX(t, vecZ, tDelta) = min{ix in length(vecZ) : time(ix) - t > tDelta}
因此,对于3分钟,
tDelta = 180
。如果t=2500
,那么forwardIX()
的结果将是3012(即time(vecZ)[2500]为860.1462,time(vecZ)[3012]为1040.403,或超过180秒),而backwardIX()
的输出将为2020(对应时间为680.7162秒)。理想情况下,我希望使用不需要
t
的函数,因为这将需要对函数进行length(vecZ)
次调用,忽略了可以更有效地计算时间滑动窗口的事实。对时间滚动窗口中的所有值应用一个函数。我看到过
rollapply
,它使用固定的窗口大小(即固定数量的索引,但不是固定的时间窗口)。我可以用一个循环(或foreach
;-))来计算每个索引t
,但我想知道是否已经有一些简单的函数实现了,例如计算给定时间范围内所有值的平均值的函数。由于这可以通过滑动窗口的简单汇总统计信息有效地完成,因此应该比访问所有数据多次以计算每个统计量的函数更具计算效率。一些相当自然的函数:平均值、最小值、最大值和中位数。即使窗口的大小不随时间变化,也可以变化窗口的大小,并且可以使用上述问题的结果找到窗口的大小。但是,这仍然需要额外的计算,因此能够指定基于时间的区间似乎更有效率。
在R中是否有可以方便进行时间窗口数据操作的包,还是我需要自己编写函数?
注意1:这个问题旨在实现类似的功能,但是针对不相交的时间段,而不是滚动时间窗口,例如,我可以将此适应于每个连续的3分钟块上进行分析,但我不知道如何将其调整为滚动3分钟间隔。
注意2:我发现从
zoo
对象切换到数字向量(用于时间)显着加快了第一个目标的范围查找/窗口端点识别问题。那仍然是一个天真的算法,但值得一提的是,使用zoo
对象可能不是天真方法的最佳选择。
xts
这样做。 - Iteratorrollapply
支持将width
作为列表 - 我只需要弄清楚如何获得那个列表就可以了。 - Iteratordata.table
,因为我对它相对熟悉,但是sqldf
也非常吸引人。 - Iterator