私は非常に大きな時系列を持っており、最初の任意の値に基づいて異なる時系列を作成し、現在の期間を変更する必要があります。実際のデータセットでは、この変更は、データフレームの他の変数に依存するが、次のように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
第1の観察における値は、任意に選択されたinitial_value
によって決定される。 value
には制限がなかった場合は、これはdata.table
を使用して非常に高速であるだけで
df <- df[, value0 := initial_value + cumsum(change)]
として作成することができます。しかし、残念ながら、change
は前の期間の実際のvalue
に依存することがあります。具体的には、102に達する度に次の期間にシリーズがinitial_value
に到達し、3つの期間にわたってそこにとどまる必要があるとします。
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
}
}
}
:私はこの結果を生み出すことに成功し
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
これまでのところ唯一の方法は、ループを使用している:したがって、次のデータフレームでは、私は上記のコードはvalue0
を生産しながら、変数value
を作成する必要があります
しかし、何十万もの観測をループするのは非常に遅いです。可能性としてベクトル化する方法や、単にプロセスをより効率的に実行する方法はありますか?
すごい!ありがとう!私は、Rcppループが非常に速く動作することは知らなかった。 –