В вашем конкретном случае это проще, чем кажется.
Просто для упрощения вопроса, скажем, у вас есть два вектора a
и b
, определенные таким образом:
a <- c(4, rep(0, 9))
b <- 1:10
Вы хотите обновить a
на основе предыдущих значений a
и b
.Алгоритм как я понял из твоего вопроса:
Если i > 1
: a[i] = a[i - 1] * b[i - 1]
.
Таким образом a[1] = a[1]
, a[2] = a[1] * b[1]
, a[3] = a[2] * b[2] = a[1] * b[1] * b[2]
, ..., a[i + 1] = a[1] * b[1] * b[2] * ... b[i]
Это означает, что a[i + 1]
зависит только от a[1]
и совокупного продукта из b[i]
для всех i = 1...i
, а не зависит от всехостальные старые значения a
.
Таким образом:
(a[2:length(a)] <- a[1] * cumprod(b[-length(b)]))
# [1] 4 8 24 96 480 2880 20160 161280 1451520
Применяя это к вашему примеру:
df$C[2:nrow(df)] <- df$C[1] * cumprod(df$E[-nrow(df)])
df
# A tibble: 13 x 7
SlNo Scenario A B C D E
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 NA NA NA NA 4.00e 0 NA 6
2 1 1 14 13 2.40e 1 0 91
3 4 1 14 14 2.18e 3 0 98
4 7 1 13 10 2.14e 5 0 65
5 10 1 2 13 1.39e 7 0 13
6 2 2 6 16 1.81e 8 0 48
7 5 2 1 14 8.68e 9 0 7
8 8 2 7 14 6.08e10 0 49
9 11 2 13 9 2.98e12 0 58.5
10 3 3 11 13 1.74e14 0 71.5
11 6 3 9 12 1.25e16 0 54
12 9 3 17 14 6.73e17 0 119
13 12 3 14 22 8.00e19 0 154