【问题标题】:avoid for-loop in R to generate series避免R中的for循环生成系列
【发布时间】:2014-07-17 21:08:10
【问题描述】:

我经常发现自己在 R 中使用以下结构:

a    <- c(1, rep(NA, 20))
rate <- 1.2     

for (i in 2:length(a)){
   a[i] <- a[i-1]*rate
}

which yields:
> a
 [1]  1.000000  1.200000  1.440000  1.728000  2.073600 ... 

避免for/while循环,还有什么更“类似于R”的方式来实现这一点?

在电子表格中很容易做到这一点!:

以下相关问题无法回答我的问题:
avoid for loop in R
How to avoid for loop in this dataset?

【问题讨论】:

    标签: r excel for-loop apply


    【解决方案1】:

    由于幂函数 ^ 是矢量化的,您可以创建一系列索引并提高您的速率。

    rate <- 1.2
    a <- rate^(0:19)
    

    【讨论】:

    • 非常简洁的解决方案,@Miff。谢谢!我想知道如何进一步概括这一点。说我的 for 循环中的替换而不是 a[i-1]*ratea[i-1]*df$var2[i-1]*rate 更复杂。我应该探索 apply 系列函数吗?
    • @DanielRP 听起来您可能想研究zoo 包以了解沿向量(或时间序列)的操作。另一种选择:由于您正在寻找a[i] &lt;- f(a[i-1]) 的通用解决方案,因此您不能直接使用矢量化操作,但您可以创建f(x) 函数并将vectorize 应用于它。
    【解决方案2】:

    对于您的具体示例,cumprod 函数是一种简单的方法:

    a <- c(1, rep(1.2, 20) )
    a <- cumprod(a)
    

    更一般地说,如果您的过程没有 cum 函数,但您想要那种类型的功能,那么您也可以使用 Reduce 函数:

    a <- c(1, rep(1.2, 20))
    a <- Reduce(`*`, a, accumulate=TRUE)
    

    但是请考虑,虽然在 R 中避免循环有一定的优雅,但从实际的角度来看,循环可能是最快的整体答案(当您包括编程和运行时间时)。 R 中的循环已经过优化,可以相当快地运行(除非你创建了一个非常糟糕的循环,但你的循环是做事的有效方法的一个例子)并且通常如果你能想到循环方法,那么通过矢量化节省的时间可能是少于考虑如何矢量化它的额外时间。除非要在很长的循环中多次执行此操作,否则节省的时间可能太少而无关紧要(请参阅fortune(98))。在向量很长的情况下,for 循环和向量化替代方案之间的舍入可能不同,因此这个问题可能比速度更重要。

    学习for 的替代方法非常适合提高您的知识/编程技能,并且可以极大地简化大量代码,只是不要觉得您总是必须找到for 的替代方法。

    【讨论】:

    • 接受了答案,因为它为问题提供了一个具体和一般的解决方案,进一步扩展了关于 R 中循环使用的讨论。它给我这个非程序员增加了很多,让我觉得使用循环的“不那么愚蠢”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2011-06-21
    • 1970-01-01
    • 2021-08-19
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多