这就是我的数据框架的样子。 V3
是我想要的专栏。我无法使用V3
。
library(data.table)
dt <- fread('
Level V1 V2
0 10 2
1 0 3
1 0 2
1 0 2 ')
我试图根据V3的先前值计算V3。 V3公式为:
New Value of V3 =((Prior Value of V3+ Prior Value of V3*V2)*Level)+V1
1st Row V3 = (NA+NA*3)*1 + 10 = 10
2nd Row V3 = (10+10*3)*1 + 0 =40
3rd Row V3 = (40+40*2)*1 + 0 =120
4th Row V3 = (120+120*2)*1 + 0 = 360
输出应该如下所示。
Level V1 V2 V3
0 10 2 10
1 0 3 40
1 0 2 120
1 0 2 360
我在尝试:
dt[,V3:= (cumsum(V3+V3*V2)*Level)+V1]
答案 0 :(得分:2)
我在评论中重新努力以获得理想的结果:
dt[,V3:=cumprod( c(V1[1] ,(Level*(1 + V2))[-1]) ) ]
dt
Level V1 V2 V3
1: 0 10 2 10
2: 1 0 3 40
3: 1 0 2 120
4: 1 0 2 360
我实际上没有使用dt [,V3:= V1 [1] * cumprod((Level *(1 + V2))[ - 1])]得到错误(仅警告)。使用[-1]缩短了没有延伸的cumprod,并导致回收。
答案 1 :(得分:1)
data.table
dt[,{ lag.V3=c(0, V3[-.N]) ; V3 = (lag.V3 + lag.V3 * V2 )* Level + V1 }]
输出
[1] 10 40 120 360
答案 2 :(得分:0)
以下是dplyr
dt %>%
mutate(V4=lag(V3) + lag(V3)*V2 + V1,
V4=ifelse(is.na(V4), 0, V4))
Level V1 V2 V3 V4
1 0 10 2 10 0
2 1 0 3 40 40
3 1 0 2 120 120
4 1 0 2 360 360