【问题标题】:R - Vectorizing for loopsR - 循环向量化
【发布时间】: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 &lt;- numeric(nrow(large.data.frame))
  • 这篇关于泛函的文章帮助我入门:adv-r.had.co.nz/Functionals.html.

标签: r for-loop vector vectorization


【解决方案1】:

您的代码当然可以变得更快。一个简单的步骤是预先计算月份,而不是多次计算。矢量化将使其更快。我认为下面的代码应该可以工作,将月份映射到 CPI - 如果没有一些测试数据很难测试。

require(plyr)
CPImatch <- mapvalues(months(large.data.frame$Date), from  = months(CPI$Date), to = CPI[,2])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多