R:使用类似于 cumsum(折旧)的前一行(=滞后)的迭代更新值创建变量

R: Create variable using iteratively updated values of previous row (=lag) similar to cumsum (depreciation)

我的目标是计算将 value 添加到前一行的累加和 csum 乘以标量 delta。来自 Stata(这是显而易见的),我不知道它不适用于 dplyrlag 函数(参见:),也不适用于 data.tableshift 因为两个命令都不会迭代更新 csum。似乎需要某种循环,但我不知道该怎么做。

的代码

delta= 0.94
df <- df %>% mutate(dcsum1 = value + delta*lag(csum, default=0))

setDT(df) #library(data.table) required
df$dcsumR2=df$csum

示例数据和所需输出:

library(dplyr)
df <- tribble(~date, ~value,~csum,~dplyr_lag_output,~desired_output,
              "2017-01-01", 1,1,1,1,
              "2017-01-02", 2,3,2.94,2.94,
              "2017-01-03", NA,3,2.94,2.76,
              "2017-01-04", 3,6,5.82,5.49,
              "2017-01-05", 4,10,9.64,8.94 )

您可以将 Reduceaccumulate = T 一起使用:

Reduce(function(prev,value)  delta * prev + ifelse(is.na(value),0,value), x=df$value[-1], init = ifelse(is.na(df$value[1]),0,df$value[1]), accumulate = T)

[1] 1.000000 2.940000 2.763600 5.597784 9.261917

data.table:

library(data.table)
setDT(df)

df[,output:=Reduce(function(prev,value)  delta * prev + ifelse(is.na(value),0,value), x=value[-1], init = ifelse(is.na(value[1]),0,value[1]), accumulate = T)]