This is related to R: use the newly generated data in the previous row
I realized the actual problem I was faced with is a bit more complicated than the example I gave in the thread above - it seems I have to pass 3 arguments to the recursive calculation to achieve what I want. Thus, accumulate2 or reduce may not work. So I open a new question here to avoid possible confusion.
I have the following dataset grouped by ID:
ID <- c(1, 2, 2, 3, 3, 3) pw <- c(1:6) add <- c(1, 2, 3, 5, 7, 8) x <- c(1, 2, NA, 4, NA, NA) df <- data.frame(ID, pw, add, x) df ID pw add x 1 1 1 1 1 2 2 2 2 2 3 2 3 3 NA 4 3 4 5 4 5 3 5 7 NA 6 3 6 8 NA Within each group for column x, I want to keep the value of the first row as it is, while fill in the remaining rows with lagged values raised to the power stored in pw, and add to the exponent the value in add. I want to update the lagged values as I proceed. So I would like to have:
ID pw add x 1 1 1 1 1 2 2 2 2 2 3 2 3 3 2^3 + 3 4 3 4 5 4 5 3 5 7 4^5 + 7 6 3 6 8 (4^5 + 7)^6 + 8 I have to apply this calculation to a large dataset, so it would be perfect if there is a fast way to do this!
do.call(rbind, Reduce(function(x, y)if(is.na(y$x))modifyList(x, list(x=x$x^y$pw+y$add)) else y,split(df, seq(nrow(df))), accumulate = TRUE))accumulate. See this question if you want to know it how. Nevertheless, it can be solved by a for loop also.