R:使用类似于 cumsum(折旧)的前一行(=滞后)的迭代更新值创建变量
R: Create variable using iteratively updated values of previous row (=lag) similar to cumsum (depreciation)
我的目标是计算将 value
添加到前一行的累加和 csum
乘以标量 delta
。来自 Stata(这是显而易见的),我不知道它不适用于 dplyr
的 lag
函数(参见:),也不适用于 data.table
的 shift
因为两个命令都不会迭代更新 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 )
您可以将 Reduce
与 accumulate = 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)]
我的目标是计算将 value
添加到前一行的累加和 csum
乘以标量 delta
。来自 Stata(这是显而易见的),我不知道它不适用于 dplyr
的 lag
函数(参见:data.table
的 shift
因为两个命令都不会迭代更新 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 )
您可以将 Reduce
与 accumulate = 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)]