2015-12-11 128 views
1

我所使用的大部分數據集一般都是中等大小(大多數少於100k行),因此我的代碼執行時間對我來說通常不是那麼大的問題。減少計算時間

但是我最近試圖編寫一個函數,它將2個數據幀作爲參數(例如,使用n行),並返回一個包含m * n行的新數據幀。然後我必須對結果數據集執行一些操作。因此,即使在小數值的情況下(比如每個數值大約爲1000),所得到的數據幀也會有超過一百萬行。

當我嘗試對這個數據集進行簡單的操作時,代碼需要很長的時間才能運行。具體來說,我的結果數據框有2列與數值,我需要添加一個新的列,將比較這些列的值,並將它們分類爲 - 「大於」,「小於」,「綁」

我現在用下面的代碼:

df %>% mutate(compare=ifelse(var1==var2,"tied", 
       ifelse(var1>var2,"Greater than","lesser then") 

而且,正如我前面提到的,這需要永遠運行。我對此做了一些研究,我發現顯然data.table上的操作比dataframe快得多,所以也許這是我可以嘗試的一種選擇。

但我從來沒有使用過data.tables。因此,在我深入研究之前,我很想知道是否有其他方法可以加快大型數據集的計算時間。

您認爲我可以嘗試其他的選擇嗎?

謝謝!

+3

使用'sign'在這種情況下:'比較= C( 「捆綁」 「比更小的」, 「大於」)號(VAR1,VAR2)+2]' – nicola

+2

已經有非常大的合作R中的數據集(高達1500萬行),只需咬緊牙關即可切換到data.table。它不僅可以通過正確的向量化代碼加速代碼10x +,而且我認爲語法更容易理解。我放棄了開關,並且感到遺憾,因爲我花了很多時間等待我的函數運行大型數據框架。 –

回答

1

對於像這樣的大問題,我喜歡並行化。由於對各行的操作是原子操作,這意味着對特定行的操作結果獨立於其他行,這是一種「不同程度的並行」情況。

library(doParallel) 
library(foreach) 

registerDoParallel() #You could specify the number of cores to use here. See the documentation. 

df$compare <- foreach(m=df$m, n=df$n, .combine='c') %dopar% { 
    #Borrowing from @nicola in the comments because it's a good solution. 
    c('Less Than', 'Tied', 'Greater Than')[sign(m-n)+2] 
} 
+0

非常感謝您的意見和建議! – Dataminer