【发布时间】: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 <- within(df1, newCol <- df1$Id %in% df2$Id),您应该会获得约 10k 倍的加速。 -
哇,这就是你作为 R 新手得到的 :-) 谢谢!这解决了问题并且有意义 - 感谢您的解释!
-
@Gregor,将 cmets 作为答案发布...?
-
没错,这样我才能给予应得的荣誉;)
-
代码是否返回所需的结果?有趣的是,您从未使用过迭代器变量
i,所以您多次执行相同的操作!删除for,但保持中间,你就有了一个矢量化的操作!
标签: r performance loops