Gus*_*lva 1 performance loops r
最近我一直在研究一些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)
Run Code Online (Sandbox Code Playgroud)
数据集有大约10k行,所以没有必要需要6分钟(测试proc.time()完全执行它,这就是它目前正在发生的事情.另外,我需要这样做其他类型的检查,所以我真的需要得到这个权利.
我在那里做错什么是浪费时间去完成?
谢谢您的帮助!
你的代码是矢量化的 - 不需要for循环.在这种情况下,您可以告诉,因为您甚至不在i循环内部使用.这意味着你的循环执行完全相同的代码完全相同的结果10k次.如果删除功能行周围的for包装器
df1 <- within(df1, newCol <- df1$Id %in% df2$Id)
Run Code Online (Sandbox Code Playgroud)
你应该加速~10k倍.
另一个评论是内部的观点是避免在里面重新键入数据框的名称.因此,您在df1$内部使用时忽略了这一点within(),并且您的数据框名称太短,以至于within()在这种情况下输入的时间更长.您的整个代码可以简化为一行:
df1$newCol = factor(df1$Id %in% df2$Id)
Run Code Online (Sandbox Code Playgroud)
我的最后一点评论是关于你的应用程序的无知状态,所以把它当作一粒盐,但二进制变量几乎总是比boolean(TRUE/FALSE)或整数(1/0)更好.作为一个因素.它确实取决于你正在做什么,但我会在factor()必要时离开.