Как обновить значения ячеек в кадре данных, которые зависят от значений в предыдущих ячейках в том же столбце? - PullRequest
0 голосов
/ 08 февраля 2019

Значения ячейки в кадре данных зависят от значений в предыдущих ячейках в том же столбце и значений в другом столбце.Я не уверен, как обновить их динамически.Я изо всех сил стараюсь показать пример того, чего я пытаюсь достичь:

library(tidyverse)
set.seed(50)

df <- data_frame(SlNo = 1:12,
                 Scenario = rep(c(1, 2, 3),4),
                 A = round(rnorm(12, 11, 6)),
                 B = round(rnorm(12, 15, 4))) %>%
      arrange(Scenario) %>% mutate(C = 0, D = 0, E = A*B/2)

df<- add_row(df, .before = 1)

df$C[1] <- 4
df$E[1] <- 6

df$C[2] <- lag(df$C, 1)[2] * lag(df$E, 1)[2]


df$C[3] <- lag(df$C, 1)[3] * lag(df$E, 1)[3]

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    NA   6  
 2     1        1    14    13    24     0  91  
 3     4        1    14    14  2184     0  98  
 4     7        1    13    10     0     0  65  
 5    10        1     2    13     0     0  13  
 6     2        2     6    16     0     0  48  
 7     5        2     1    14     0     0   7  
 8     8        2     7    14     0     0  49  
 9    11        2    13     9     0     0  58.5
10     3        3    11    13     0     0  71.5
11     6        3     9    12     0     0  54  
12     9        3    17    14     0     0 119  
13    12        3    14    22     0     0 154 

Я бы хотел, чтобы каждая ячейка в столбце C динамически обновлялась на основе значений в предыдущих ячейках.Любая помощь очень ценится.Заранее большое спасибо !!!

1 Ответ

0 голосов
/ 08 февраля 2019

В вашем конкретном случае это проще, чем кажется.

Просто для упрощения вопроса, скажем, у вас есть два вектора 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  
...