R中的循环-无论如何都需要使用索引来避免';对于';?

R中的循环-无论如何都需要使用索引来避免';对于';?,r,loops,for-loop,R,Loops,For Loop,我知道在R中使用for循环不是最佳实践,因为它没有增强的性能。几乎在所有情况下,都有一个家族的函数*apply解决了我们的问题 然而,我面临的情况是,我看不到解决办法 我需要计算连续值的百分比变化: pv[1] <- 0 for(i in 2:length(x)) { pv[i] <- (x[i] - x[i-1])/x[i-1] } pv[1]您可以通过以下方法获得相同的结果: pv <- c(0) y <- sapply(2:length(x), functio

我知道在R中使用
for
循环不是最佳实践,因为它没有增强的性能。几乎在所有情况下,都有一个家族的函数
*apply
解决了我们的问题

然而,我面临的情况是,我看不到解决办法

我需要计算连续值的百分比变化:

pv[1] <- 0
for(i in 2:length(x)) {
  pv[i] <- (x[i] - x[i-1])/x[i-1]
}

pv[1]您可以通过以下方法获得相同的结果:

pv <- c(0)
y <- sapply(2:length(x), function(i) {pv <<- (x[i] - x[i-1])/x[i-1]})
c(0, y)

您提供的是分数变化,但如果乘以100,则得到“百分比变化”:


pv您也可以使用
diff

c( 0, diff(x) / x[-length(x)] )
c( 0, exp(diff(log(x))) - 1 )

回答得好,德温。我不知道海报到底完成了什么,但我完全同意矢量化+回答得很好!我不知道矢量化方法是最快的,我认为
lappy
是最快的。但是在最后一行代码中,不应该是
x[-1]-x[-length(x)]
?@JoãoDaniel:是的,应该是。编辑应用。什么是“DIF”版本,整个测试是什么样子的?@VincentZoonekynd的解决方案对我来说运行得最快。应该是DIFF for DIFF(Vincent的)。公平地说,基准测试别忘了从DWin的解决方案中去掉*100,因为这增加了额外的计算,这是百分之一(不像everyone eles的解决方案那样是一个比例)。我对事物的名称进行了一些调整,以便更清楚基准测试中的内容。人们可以在未来Q关于循环构造的效率时引用这个答案。+1这似乎是最快的。。。我喜欢log/exp变量,尽管它没有那么快。帽子提示:我必须承认diff()方法比我直接翻译成矢量化解决方案要优雅一些。我很惊讶它没有更好地进行基准测试。@dwn-当我进行基准测试时,使用
diff
或不使用都没有区别。但是用
c
代替你的替代品要快得多。泰勒的数字有些可疑。我在
x@上运行了它汤米:我们应该把苹果和苹果进行比较。(需要在使用
diff
的版本中进行替换操作,以使比较具有信息性。)
pv<- vector("numeric",length(x))
pv[1] <- 0
pv[-1] <- 100* ( x[-1] - x[-length(x)] )/ x[-length(x)]
c( 0, diff(x) / x[-length(x)] )
c( 0, exp(diff(log(x))) - 1 )