R基于同一列中的先前值的累积计算

时间:2016-11-08 00:18:24

标签: r data.table dplyr cumsum

这就是我的数据框架的样子。 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]

3 个答案:

答案 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