我是R的新手,似乎无法掌握如何调用之前的"自我"值,在这种情况下是前一个"b" b[-1]
.
b <- ( ( 1 / 14 ) * MyData$High + (( 13 / 14 )*b[-1]))
显然我在那里的某个地方需要一个NA用于第一次计算,但我无法自己解决这个问题.
添加所寻求的结果应该是的例子(A = MyData $ High):
A b 1 5 NA 2 10 0.7142... 3 15 3.0393... 4 20 4.6079...
G. Grothendi.. 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
赠送:
> MyData A b 1 5 NA 2 10 0.7142857 3 15 1.7346939 4 20 3.0393586
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
给出相同的结果.
这给出了矢量化的外观,但实际上如果你看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
再次给出相同的结果.
注意:所有解决方案都假设MyData
至少有一行.
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
赠送:
> MyData A b 1 5 NA 2 10 0.7142857 3 15 1.7346939 4 20 3.0393586
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
给出相同的结果.
这给出了矢量化的外观,但实际上如果你看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
再次给出相同的结果.
注意:所有解决方案都假设MyData
至少有一行.