2016-11-03 71 views
1

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

更具体地说,我需要帮助改善这个代码块:

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

数据集有大约10,000行,因此没有意义需要6分钟(与proc.time()测试,以彻底执行它,这是什么它目前正在发生的事情。另外,我必须这样做其他类型的检查的,所以我真的需要得到这个权利。

我在做什么错在那里被吞噬的时间内完成?

谢谢你你的帮助!

+7

你的代码是矢量化的 - 不需要for循环。在这种情况下,你可以告诉因为*你甚至不在循环内使用'i' *。如果你有10K行,那么你正在运行完整的操作10K次。如果你在你的函数行中删除'for'包装,'df1 < - (df1,newCol < - df1 $ Id%in%df2 $ Id)',你应该得到〜10k倍的加速。 – Gregor

+0

哇,这就是你在R中获得新手的原因:-)谢谢!解决了这个问题并且有意义 - 感谢解释! –

+1

@Gregor,发表评论为答案...? –

回答

9

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

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

你应该得到〜10K倍的加速。

另一个评论是,其中的要点是避免重新输入数据框的名称。因此,您在within()内使用df1$就错过了要点,而且您的数据框名称非常短,以致在此情况下输入within()的时间更长。你的整个代码可以简化为一条线:

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

我最后的评论我是从你的应用程序无知的状态进行,所以把它当作一粒盐,但二元变量几乎总是更好具有布尔型(TRUE/FALSE)或整数(1/0)作为因子。它取决于你在做什么,但我会将factor()关闭直到有必要。