如何更新数据框中的单元格值,该值取决于同一列中前面的单元格中的值?

时间:2019-02-07 22:17:04

标签: r dataframe dplyr tidyverse

数据帧中单元格的值取决于同一列中前面的单元格中的值以及另一列中的值。我不确定如何动态更新它们。我正在尽力举例说明我要实现的目标:

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 :(得分:1)

在您的特定情况下,它比看起来容易。

为简化问题,假设您有两个向量ab定义如下:

a <- c(4, rep(0, 9))
b <- 1:10

您要基于aa的先前值更新b。我从您的问题中了解了该算法:

如果i > 1a[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]的{​​{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