R (1-以前的_记录)*当前_记录的累积乘积
数据框包含两个变量(R (1-以前的_记录)*当前_记录的累积乘积,r,dplyr,accumulate,R,Dplyr,Accumulate,数据框包含两个变量(time和rate)和10个观察值 time <- seq(1:10) rate <- 1-(0.99^time) dat <- data.frame(time, rate) 如何在base R或dplyr中实现这一点?cumprod,以进行救援(简化代码的提示): 逻辑是,您实际上是在执行1-dat$rate的cum累积product,乘以当前步骤。 在第一步中,您可以只保留现有值,但随后需要偏移两个向量,以便乘法得到所需的结果 证明: out <
time
和rate
)和10个观察值
time <- seq(1:10)
rate <- 1-(0.99^time)
dat <- data.frame(time, rate)
如何在base R或dplyr中实现这一点?
cumprod
,以进行救援(简化代码的提示):
逻辑是,您实际上是在执行1-dat$rate
的cum
累积prod
uct,乘以当前步骤。在第一步中,您可以只保留现有值,但随后需要偏移两个向量,以便乘法得到所需的结果 证明:
out <- c(
dat$rate[1],
(1-dat$rate[1])*dat$rate[2],
(1-dat$rate[1])*(1-dat$rate[2])*dat$rate[3],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*dat$rate[4],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*dat$rate[5],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*dat$rate[6],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*(1-dat$rate[6])*dat$rate[7],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*(1-dat$rate[6])*(1-dat$rate[7])*dat$rate[8],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*(1-dat$rate[6])*(1-dat$rate[7])*(1-dat$rate[8])*dat$rate[9],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*(1-dat$rate[6])*(1-dat$rate[7])*(1-dat$rate[8])*(1-dat$rate[9])*dat$rate[10]
)
all.equal(
dat$rate * c(1, cumprod(1 - head(dat$rate, -1))),
out
)
#[1] TRUE
out
dat$rate * c(1, cumprod(1 - head(dat$rate, -1)))
out <- c(
dat$rate[1],
(1-dat$rate[1])*dat$rate[2],
(1-dat$rate[1])*(1-dat$rate[2])*dat$rate[3],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*dat$rate[4],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*dat$rate[5],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*dat$rate[6],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*(1-dat$rate[6])*dat$rate[7],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*(1-dat$rate[6])*(1-dat$rate[7])*dat$rate[8],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*(1-dat$rate[6])*(1-dat$rate[7])*(1-dat$rate[8])*dat$rate[9],
(1-dat$rate[1])*(1-dat$rate[2])*(1-dat$rate[3])*(1-dat$rate[4])*(1-dat$rate[5])*(1-dat$rate[6])*(1-dat$rate[7])*(1-dat$rate[8])*(1-dat$rate[9])*dat$rate[10]
)
all.equal(
dat$rate * c(1, cumprod(1 - head(dat$rate, -1))),
out
)
#[1] TRUE