【发布时间】:2016-08-10 19:36:16
【问题描述】:
我想知道是否以及如何通过使用矢量化函数而不是 for 循环来提高代码效率。
我正在处理一个包含大约 160 万个观测值的数据集。我想根据通货膨胀调整价格,所以我需要将观察月份与相应 CPI 指数的月份相匹配。我有一个主数据框(有 160 万个观察值的那个)和一个带有我需要的 CPI 指数的数据框(这只有 12 个观察值,在我进行分析的一年中的每个月都有一个)。
以下是我尝试将每个观察结果与其对应的 CPI 指数“匹配”的方法:
`for(i in 1:nrow(large.data.frame)){
for(j in 1:nrow(CPI)){
if(months(large.data.frame[i,"Date"])==months(CPI[j,"Date"])){
CPImatch[i] <- CPI[j,2]
}
else next
}
}`
注意:CPImatch 是一个单独的数据框,我将使用它来放置匹配的值,然后将其与我的初始数据框 cbind。同样,我知道可能有更好的方法来做到这一点......
由于我的代码仍在运行,我知道这是一种非常低效(甚至可能是错误)的方式来做我想做的事情。有没有办法对这个循环进行矢量化,可能使用apply 系列的函数?
非常感谢任何反馈!
【问题讨论】:
-
如果您可以使用 large.data.frame 和 CPI 数据的小示例以及预期结果来编辑您的问题,那就太好了。这看起来不需要循环,也许只是匹配。 Info on making a reproducible example
-
提高速度的最重要的事情之一就是在循环上方预分配 CPImatch:
CPImatch <- numeric(nrow(large.data.frame)) -
这篇关于泛函的文章帮助我入门:adv-r.had.co.nz/Functionals.html.
标签: r for-loop vector vectorization