Вот решение с использованием accumulate
из пакета purrr
.Функция accumulate
может применять функцию с двумя аргументами, такими как x
и y
, к последовательности вектора.Возвращаемое значение станет входным значением следующего раунда.
В следующем примере я попросил функцию accumulate
начинать со второго числа столбца In
до конца.Я также предоставил 1
аргументу .init
, который будет первым x
функции.
library(dplyr)
library(purrr)
df <- data.frame(In = c(1,4,0,0,1,2,3,0,0), Vol = c(1,rep(NA,8)))
df %>%
mutate(Vol = accumulate(In[2:n()], function(x, y) (x + y) * 0.99, .init = 1))
# In Vol
# 1 1 1.000000
# 2 4 4.950000
# 3 0 4.900500
# 4 0 4.851495
# 5 1 5.792980
# 6 2 7.715050
# 7 3 10.607900
# 8 0 10.501821
# 9 0 10.396803
Кроме того, похоже, что первое значение из столбца Vol
совпадает с первым значением столбца In
.Если вы пытаетесь сделать accumulate
процесс просто в столбце In
, следующий код будет более кратким, и вам даже не нужно копировать первое значение в столбец Vol
.
df %>%
mutate(Vol = accumulate(In, function(x, y) (x + y) * 0.99))
# In Vol
# 1 1 1.000000
# 2 4 4.950000
# 3 0 4.900500
# 4 0 4.851495
# 5 1 5.792980
# 6 2 7.715050
# 7 3 10.607900
# 8 0 10.501821
# 9 0 10.396803