I've to execute a sequential formula in two data.frame columns, but the value of one column is the input to the other column and vice-versa. Besides, I need to get the value of the previous row to apply a conditional command.
This is an example of the dataframe I'm working on.
df <- data.frame(A=c(0.91,0.98,1,1.1), B=c(0.81, 1.11, 0.83, 0.92), C=c(0.09,0.06,0.09,0.08))
df$D <- NA
df$E <- NA
df[1,]$D <- 0.0
This is the output I'm expecting to get:
> df
A B C D E
1 0.91 0.81 0.09 0.00000000 0.06971574
2 0.98 1.11 0.06 0.06971574 0.13029718
3 1.00 0.83 0.09 0.13029718 0.19051977
4 1.10 0.92 0.08 0.00000000 0.07073296
Basically, the value of column C depends on the values of column A of the previous row. If the previous row A is lower than 4, then C is equal to the value of column D on the row before. Otherwise, C is the result of the previous row A * B
. The column D does not use the row before, but needs the result of column C to get the result of the formula: B - (B - D) * exp(-C)
. Therefore, the first entry of column D is initialized with zero.
I think I could do it through dplyr::mutate, such as:
df %>%
mutate(D = ifelse( lag(A) < 1, lag(E), lag(E) - lag(E) * lag(A)),
E = B - (B - D) * exp(-C)
)
But it does not really work as expected.