gpt4 book ai didi

r - 使用初始值后的前一个值对向量执行操作

转载 作者:行者123 更新时间:2023-12-04 13:08:00 26 4
gpt4 key购买 nike

在 Excel 中,通过引用先前的单元格可以轻松地对先前的单元格执行计算。例如,从初始值 100(步长 = 0)开始,每个下一步都是 0.9 * previous + 9只需从第一个单元格向下拖动公式栏(步骤 = 1)。接下来的 10 个步骤如下所示:

      step     value
[1,] 0 100.00000
[2,] 1 99.00000
[3,] 2 98.10000
[4,] 3 97.29000
[5,] 4 96.56100
[6,] 5 95.90490
[7,] 6 95.31441
[8,] 7 94.78297
[9,] 8 94.30467
[10,] 9 93.87420
[11,] 10 93.48678

我环顾了网络和 StackOverflow,我能想到的最好的方法是 for循环(下)。有没有更有效的方法来做到这一点?是否有可能避免 for环形?似乎 R 中的大多数函数(例如 cumsumdiffapply 等)适用于现有向量,而不是从以前的向量中动态计算新值。
#for loop.  This works
value <- 100 #Initial value
for(i in 2:11) {
current <- 0.9 * value[i-1] + 9
value <- append(value, current)
}
cbind(step = 0:10, value) #Prints the example output shown above

最佳答案

看起来您正在寻找一种在 R 中进行递归计算的方法。 Base R 有两种方法可以做到这一点,它们的区别在于用于进行递归的函数的形式。这两种方法都可以用于您的示例。
Reduce可以与形式 v[i+1] = function(v[i], x[i]) 的递归方程一起使用哪里v是计算出的向量和 x一个输入向量;即哪里 i+1输出仅取决于计算向量和输入向量的第 i 个值以及由 function(v, x) 执行的计算可能是非线性的。对于你的情况,这将是

    value <- 100
nout <- 10
# v[i+1] = function(v[i], x[i])
v <- Reduce(function(v, x) .9*v + 9, x=numeric(nout), init=value, accumulate=TRUE)
cbind(step = 0:nout, v)
filter与形式 y[i+1] = x[i] + filter[1]*y[i-1] + ... + filter[p]*y[i-p] 的递归方程一起使用哪里 y是计算出的向量和 x一个输入向量;即输出可以线性依赖于计算向量的滞后值以及 i-th输入向量的值。对于您的情况,这将是:
    value <- 100
nout <- 10
# y[i+1] = x[i] + filter[1]*y[i-1] + ... + filter[p]*y[i-p]
y <- c(value, stats::filter(x=rep(9, nout), filter=.9, method="recursive", sides=1, init=value))
cbind(step = 0:nout, y)

对于这两个函数,输出的长度由输入向量的长度给出 x .
这两种方法都会给出你的结果。

关于r - 使用初始值后的前一个值对向量执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35694147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com