Excel在R中计算

时间:2013-01-30 19:17:40

标签: r

我给了两个第一个矢量值。我想从前两个计算向量的下一个值。它就像你在excel中所做的那样:用数字填充前两个单元格,在第三个单元格中写入公式,然后将其应用于更多单元格。但是,我想在没有循环的情况下这样做。

我想做的事情:

x = c()
x[1] = 1
x[2] = 2
for (i in 3:10)
    x[i] = 2*x[i-1] - 0.5*x[i-2]

x

> x
 [1]   1.0000   2.0000   3.5000   6.0000  10.2500  17.5000  29.8750  51.0000
 [9]  87.0625 148.6250
> 

我想在计算当前值时使用矢量的先前值,但不是我刚才的方式。

2 个答案:

答案 0 :(得分:4)

你可以找到系列的第i个元素,而不像这样循环:

roots <- polyroot( c(0.5, -2, 1) )
roots <- Re(roots)

k <- solve( rbind( 1, roots ), c(1,2) )

genfun <- function(n) {
    as.vector(k %*% roots^(n-1))
}

genfun(1)
genfun(2)
genfun(3)
genfun(4)

如果我们执行以下操作,则更容易与循环进行比较:

genfun2 <- Vectorize(genfun)
genfun2( 1:10 )

然而,虽然没有使用显式循环,但循环有几种用法(:使用内部循环,然后mapply在内部使用,循环也是如此),所以这不太符合“否循环“要求。即使我们手工输入'genfun(1), genfun(2), genfun(3)`,...然后我们正在使用wetware循环,即使不强制计算机循环,所以我不知道这是否重要。

就个人而言,循环似乎对我来说更简单。如果你预先分配整个向量并编写一个有效的循环,那么循环可能不会比其他方法慢。

修改

实际上你也可以使用递归函数(并存储所有中间计算)来做到这一点。我不确定这是否会被认为是“没有循环”。无论哪种方式,我都希望它比简单的循环更复杂,更慢。

答案 1 :(得分:1)

我写这个作为答案,因为我认为你的问题的答案“是否有可能”是“不”。

据我所知,如果没有循环(至少在后台),这是不可能的,因为你需要为每个连续步骤重新轮询新值。在Excel中,我知道您所指的“自动填充”选项,它在后台循环。

即使使用“嵌入”功能中的计算延迟,每次更新上一个值时仍需要再次调用该函数。在我看来,你想要做的逻辑基本上是一个循环,除非你想手工编写每一行。我不知道任何适合你的矢量化方法,因为矢量化语句必须立即完成所有工作。