我有一个非常大的时间序列,需要基于开始时的某个任意值和当前时间段中的变化来创建不同的时间序列。在实际数据集中,这种变化取决于数据框的其他变量,但为了演示,我将其重新创建如下:
initial_value <- 100
set.seed(123)
library(data.table)
df <- as.data.table(data.frame(num = c(1:10),change = rnorm(10)))
新变量value
的定义为前一时期的自身值加上当前时期的change
。第一个观测值中的值由任意选择的initial_value
确定。如果对value
没有限制,它可以简单地创建为:
df <- df[, value0 := initial_value + cumsum(change)]
使用data.table
非常快。然而,不幸的是,change
也可能依赖于上一期实际value
的值。具体来说,假设每当它达到102时,系列需要在下一期达到initial_value
并保持3个周期。因此,在下面的数据框中,我需要创建变量value
,而上面的代码生成了value0
:
num change value0 value
1: 1 -0.56047565 99.43952 99.43952
2: 2 -0.23017749 99.20935 99.20935
3: 3 1.55870831 100.76806 100.76806
4: 4 0.07050839 100.83856 100.83856
5: 5 0.12928774 100.96785 100.96785
6: 6 1.71506499 102.68292 102.68292
7: 7 0.46091621 103.14383 100.00000
8: 8 -1.26506123 101.87877 100.00000
9: 9 -0.68685285 101.19192 100.00000
10: 10 -0.44566197 100.74626 99.55434
到目前为止,我能够产生这个结果的唯一方法是使用循环:
df$value <- NA
df$value[1] <- initial_value + df$change[1]
for (i in 2:nrow(df)) {
if (is.na(df$value[i])) {
if (df$value[i-1] < 102) {
df$value[i] <- df$value[i-1] + df$change[i]
} else {
df$value[i:(i+2)] <- initial_value
}
}
}
然而,循环遍历(数百万次)观测非常缓慢。是否有可能对其进行向量化或者更高效地运行该进程?