【问题标题】:R: Speed up for loop containing whichR:加速包含哪个循环的循环
【发布时间】:2019-05-23 11:15:39
【问题描述】:

我有两个数据框 - 一个包含一组分配给它们的邮政编码和调查 (df1),另一个包含所有可能的邮政编码和包含这些邮政编码的区域 (df2)。我基本上需要删除邮政编码,并将每个调查分配到一个区域(使用邮政编码进行交叉引用)。目前我估计我的程序需要 5 小时。我怎样才能加快速度?

for (i in 1:nrows(df1)) {
    index <- which(df2$postcodes == toString(df1$postcodes[i])
    if (length(index)) {
        df1$zone <- toString(df2[index])
    } else {
        df1$zone <- 'UNMATCHED'
    }
} 

目前,我发现运行 100 个邮政编码大约需要 6 秒。

在过去的几个小时里,我尝试了很多事情,但几乎没有进展,所以任何帮助都将不胜感激!

【问题讨论】:

  • 您是否熟悉任何软件包,例如 dplyr 或 data.table 或者更喜欢 base R?如果您以可复制的格式(可以复制到 R 会话中)发布 df1df2 的示例,那也很棒
  • 听起来像是对(左)连接的默认使用...阅读:stackoverflow.com/questions/1299871/…

标签: r performance for-loop


【解决方案1】:

这听起来像是一个内连接,可以用 dplyr 来实现。您可以在之后删除postcodes 列。这是一个不错的备忘单:http://stat545.com/bit001_dplyr-cheatsheet.html

inner_join(x, y):返回 x 中在 y 中有匹配值的所有行,以及 x 和 y 中的所有列。如果有多个 x 和 y 之间的匹配,则返回匹配的所有组合。 这是一个变异连接。

【讨论】:

  • 链接是一个非常流畅的加入介绍
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2023-03-07
  • 1970-01-01
  • 2023-03-31
  • 2017-12-09
相关资源
最近更新 更多