2017-06-13 62 views
0

我有一個foreach循環在我的代碼中以減少運行時間。我面臨的問題是,我沒有得到輸出中的所有輸入記錄。以下是代碼片段。並行化(foreach)在R不工作

# my_df has 100 records 
    library(doMC) 
    library(foreach) 
    no_cores <- detectCores() 
    registerDoMC(no_cores) 
    # nrow(my_df)=100 
    output <- foreach(combo = 1:nrow(my_df),.combine=rbind) %dopar% 
    { 
    df <- my_df[combo,] #taking 1 row at a time 

      ### do some operations #### 
     score <- sum(another_df$score1+another_df$score2) 

    if(score>score_cutoff){ 
    df$score <- score   
    }else{ 
    df$score <- 0} 

    df; #rbinding *df* to *output* 
    } 

輸出數據幀應該包含100條記錄,但是我得到的記錄(小於100每次)的隨機數。我多次使用foreach,但這是第一次發生這種情況。

有人可以幫我解決這個問題嗎? 在此先感謝。

+0

我假設你在'my_df'進行計算?你能否詳細說明你的業務是什麼? – Val

+0

@Val,我編輯了問題中的代碼。我正在做的是計算_SCORE_並將該值添加到_df_ – santhoshverma

+0

@santhoshverma:你在哪裏聲明'another_df'?在「foreach」聲明之前? 'another_df'的一般格式是什麼? 2列data.frame? – CPak

回答

0

因此對於foreach您可以在索引i上同步。在你的情況下,這將是你的數據的行數my_df

你做的每一個計算都將是列表output的一個元素,你使用rbind將它們綁定在一起。到現在爲止還挺好。

我無法真正說出你是如何得到你的結果的,但通常我不認爲在foreach循環中分配如此多的變量是一個好主意。

這是我會怎麼解決呢,結果看起來不錯(有100行):

library(doParallel) 
no_cores <- detectCores() 

cl <- makeCluster(no_cores) 
registerDoParallel(cl) 

# simulate your data  
set.seed(42) 
my_df <- data.frame(A=sample(1:1000,100),B=sample(1:1000,100)) 

cutoff <- 500 

output <- foreach(i = 1:nrow(my_df),.combine=rbind) %dopar% 
{ 

    data.frame(A=my_df$A[i],B=my_df$B[i],Score=ifelse(my_df$A[i]+my_df$B[i] > cutoff,my_df$A[i]+my_df$B[i],0)) 

} 

stopCluster(cl)