R代码非常慢

时间:2016-11-03 23:04:53

标签: r performance loops

最近我一直在研究一些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()测试完全执行它,这就是它当前正在发生的事情。另外,我需要这样做其他类型的检查,所以我真的需要做到这一点。

我在那里做错什么是浪费时间去完成?

感谢您的帮助!

1 个答案:

答案 0 :(得分:9)

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

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

你应该加速~10k倍。

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

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

我的上一个评论我是对你的应用程序无知状态所做的,所以把它当作一粒盐,但二进制变量几乎总是更好,有布尔(TRUE / FALSE)或整数( 1/0)比作为一个因素。它确实取决于你用它做什么,但我会在必要时离开factor()