0

次の再現可能な例を作成しました。

library(data.table)
Col_1 <- 0.05
Col_2 <- c( "B", "A", "C", "B", "C", "A", "C", "B", "B", "A" )
Col_3 <- 1000
Col_4 <- ""
data <- data.frame( Col_1, Col_2, Col_3, Col_4 ) 
mydata.table <- as.data.table( data )[ , list( Col_1, Col_2, Col_3, Col_4 ) ]
Col1 <- "Col_1"; Col2 <- "Col_2"; Col3 <- "Col_3"; Col4 <- "Col_4"
mydata.table[, (Col4) := ifelse( get( Col2 ) == "A" , get( Col1 ) * get( Col3 ), "0" ) ]
mydata.table[ , (Col3) := cumsum( c( 1000, head( Col4, -1 )))]

私の問題は、Col3 が cumsum を正しく計算せず、1000 で静的なままであることです。このサイトの他の回答からコードを調整しましたが、少し助けが必要です。Col3 を 1000 から開始し、Col4 を累積的に追加します (1 行上に遅れます)。

出力に次のように表示したいと思います。

Col_1 <- 0.05
Col_2 <- c( "B", "A", "C", "B", "C", "A", "C", "B", "B", "A")
Col_3 <- c( 1000.0, 1000.0, 1050.0, 1050.0, 1050.0, 1050.0, 1102.5, 1102.5, 1102.5, 1102.5 ) 
Col_4 <- c( 0, 50.0, 0, 0, 0, 52.5, 0, 0, 0, 55.1 )
good_data <- data.frame( Col_1, Col_2, Col_3, Col_4 )
gooddata.table <- as.data.table( good_data )[ , list( Col_1, Col_2, Col_3, Col_4 )]

各列は別の列の結果に依存しているため、これをループで計算する必要がありますか? ありがとうございました。

以下のコメントに基づいて例を更新し、@Frank の回答のおかげで新しいコードを含めます。

library(data.table)
Col_1 <- 0.05
Col_2 <- c( "B", "A", "C", "B", "C", "A", "C", "B", "B", "A" )
Col_3 <- 1000
Col_4 <- 0
mydata.table <- data.table(Col_1, Col_2, Col_3, Col_4)
Col1 <- "Col_1"; Col2 <- "Col_2"; Col3 <- "Col_3"; Col4 <- "Col_4"
mydata.table[, (Col3) := Col_3*cumprod(1+Col_1*shift(Col_2=="A", type="lag", fill=FALSE))]
mydata.table[, (Col4) := ifelse( get( Col2 ) == "A" , get( Col1 ) * get( Col3 ), "0" ) ]
4

1 に答える 1

6

目的の出力を得るには、中間オブジェクトの作成をスキップしCol_4て、

mydata.table[, Col_3*cumprod(1 + Col_1*shift(Col_2 == "A", type = "lag", fill=FALSE))] 

これがどのように機能するかを理解するには、 と を試し?cumprodてください?shift。分割して実行することもできます。

mydata.table[, shift(Col_2 == "A", type = "lag", fill = FALSE)] 

get(コメントで言及されている の問題、および の上書きは無視していますCol_3。)

于 2015-11-17T18:04:01.347 に答える