2016-11-03 72 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()關閉直到有必要。