我有一個非常大的時間序列,我需要根據開始時的某個任意值和當前時間段中的更改創建不同的時間序列。在真實數據集這種變化取決於數據幀的其他變量,但對於MWE的目的,我重新創建如下:R編程:使用先前計算的行更新每一行
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
}
}
}
然而,循環(數十)數以百萬計的觀測數據是非常緩慢的。有沒有一種方法可以對其進行矢量化,或者只是更有效地運行流程?
令人驚歎!感謝你!我不知道Rcpp循環可以更快地工作。 –