Referring to previous row in calculation

前端 未结 2 1472
天命终不由人
天命终不由人 2021-01-12 03:48

I\'m new to R and can\'t seem to get to grips with how to call a previous value of \"self\", in this case previous \"b\" b[-1].

b <- ( ( 1 /          


        
2条回答
  •  梦谈多话
    2021-01-12 04:16

    1) for loop Normally one would just use a simple loop for this:

    MyData <- data.frame(A = c(5, 10, 15, 20))
    
    
    MyData$b <- 0
    n <- nrow(MyData)
    if (n > 1) for(i in 2:n) MyData$b[i] <- ( MyData$A[i] + 13 * MyData$b[i-1] )/ 14
    MyData$b[1] <- NA
    

    giving:

    > MyData
       A         b
    1  5        NA
    2 10 0.7142857
    3 15 1.7346939
    4 20 3.0393586
    

    2) Reduce It would also be possible to use Reduce. One first defines a function f that carries out the body of the loop and then we have Reduce invoke it repeatedly like this:

    f <- function(b, A) (A + 13 * b) / 14
    MyData$b <- Reduce(f, MyData$A[-1], 0, acc = TRUE)
    MyData$b[1] <- NA
    

    giving the same result.

    This gives the appearance of being vectorized but in fact if you look at the source of Reduce it does a for loop itself.

    3) filter Noting that the form of the problem is a recursive filter with coefficient 13/14 operating on A/14 (but with A[1] replaced with 0) we can write the following. Since filter returns a time series we use c(...) to convert it back to an ordinary vector. This approach actually is vectorized as the filter operation is performed in C.

    MyData$b <- c(filter(replace(MyData$A, 1, 0)/14, 13/14, method = "recursive"))
    MyData$b[1] <- NA
    

    again giving the same result.

    Note: All solutions assume that MyData has at least 1 row.

提交回复
热议问题