【问题标题】:R code incredibly slowR代码非常慢
【发布时间】:2016-11-03 23:04:53
【问题描述】:

最近我一直在编写一些 R 脚本来做一些报告。涉及的任务之一是检查列中的值是否与另一个数据帧的任何行匹配。如果这是真的,那么用逻辑 TRUE/FALSE 设置一个新列

更具体地说,我需要帮助改进此代码块:

for (i in 1:length(df1$Id)) {
  df1 <- within(df1, newCol <- df1$Id %in% df2$Id)
}
df1$newCol <- as.factor(df1$newCol)

数据集有大约 10k 行,因此需要 6 分钟是没有意义的(使用 proc.time() 测试以完全执行它,这是目前正在发生的情况。另外,我需要进行其他类型的检查,所以我真的需要把这件事做好。

我做错了什么需要花费时间来完成?

感谢您的帮助!

【问题讨论】:

  • 您的代码是矢量化的 - 不需要 for 循环。在这种情况下,您可以知道,因为您甚至没有在循环中使用i。如果您有 10k 行,那么您将运行完整的操作 10k 次。如果您删除功能行周围的 for 包装器 df1 &lt;- within(df1, newCol &lt;- df1$Id %in% df2$Id),您应该会获得约 10k 倍的加速。
  • 哇,这就是你作为 R 新手得到的 :-) 谢谢!这解决了问题并且有意义 - 感谢您的解释!
  • @Gregor,将 cmets 作为答案发布...?
  • 没错,这样我才能给予应得的荣誉;)
  • 代码是否返回所需的结果?有趣的是,您从未使用过迭代器变量i,所以您多次执行相同的操作!删除for,但保持中间,你就有了一个矢量化的操作!

标签: r performance loops


【解决方案1】:

您的代码是矢量化的 - 不需要 for 循环。在这种情况下,您可以分辨出来,因为您甚至没有在循环中使用i。这意味着您的循环正在为完全相同的结果执行完全相同的代码 10k 次。如果您删除功能行周围的 for 包装器

df1 <- within(df1, newCol <- df1$Id %in% df2$Id)

你应该得到大约 10k 倍的加速。

另一条评论是,inside 的目的是避免在内部重新输入数据框的名称。因此,您在within() 中使用df1$ 就忽略了这一点,而且您的数据框名称很短,在这种情况下输入within() 会更长。您的整个代码可以简化为一行:

df1$newCol = factor(df1$Id %in% df2$Id)

我在对您的应用程序一无所知的状态下发表的最后一条评论,因此请谨慎对待,但二进制变量几乎总是更适合用作布尔值 (TRUE/FALSE) 或整数 (1/ 0) 比作为一个因素。这确实取决于你用它做什么,但我会在必要时关闭factor()

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 2015-04-18
    • 2019-08-11
    • 2023-03-08
    • 1970-01-01
    • 2012-03-04
    • 2014-11-07
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多