参考前一行计算

Jen*_*nyD 8 r

我是R的新手,似乎无法掌握如何调用之前的"自我"值,在这种情况下是前一个"b" b[-1].

b <- ( ( 1 / 14 ) * MyData$High + (( 13 / 14 )*b[-1]))
Run Code Online (Sandbox Code Playgroud)

显然我在那里的某个地方需要一个NA用于第一次计算,但我无法自己解决这个问题.

添加所寻求的结果应该是的例子(A = MyData $ High):

  A  b
1 5  NA
2 10 0.7142...
3 15 3.0393...
4 20 4.6079...
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 5

1)for循环通常只需使用一个简单的循环:

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
Run Code Online (Sandbox Code Playgroud)

赠送:

> MyData
   A         b
1  5        NA
2 10 0.7142857
3 15 1.7346939
4 20 3.0393586
Run Code Online (Sandbox Code Playgroud)

2)减少 它也可以使用Reduce.首先定义一个f执行循环体的函数,然后我们Reduce重复调用它,如下所示:

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

给出相同的结果.

这给出了矢量化的外观,但实际上如果你看Reduce它的来源for本身就是一个循环.

3)过滤器注意问题的形式是一个递归滤波器,系数13/14在A/14上运行(但A [1]用0代替)我们可以编写以下内容.因为filter返回一个时间序列,我们用c(...)它来将它转换回普通的向量.实际上这种方法是矢量化的,因为过滤操作是在C中执行的.

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

再次给出相同的结果.

注意:所有解决方案都假设MyData至少有一行.