数据帧中单元格的值取决于同一列中前面的单元格中的值以及另一列中的值。我不确定如何动态更新它们。我正在尽力举例说明我要实现的目标:
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列中的每个单元格根据前面单元格中的值动态更新。任何帮助是极大的赞赏。提前非常感谢您!
答案 0 :(得分:1)
在您的特定情况下,它比看起来容易。
为简化问题,假设您有两个向量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]
的{{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