2015-07-20 101 views
0

對於一個輸入數據幀有沒有一種方法可以並行運行循環的彙總函數?

input<-data.frame(col1=seq(1,10000),col2=seq(1,10000),col3=seq(1,10000),col4=seq(1,10000)) 

我要運行存儲在另一個數據幀中的下面的摘要

summary<-data.frame(Summary_name=c('Col1_col2','Col3_Col4','Col2_Col3'), 
ColIndex=c("1,2","3,4","2,3")) 

#summary 
Summary_name ColIndex 
Col1_col2  1,2 
Col3_Col4  3,4 
Col2_Col3  2,3 

我有以下函數來運行這些聚集體

loopSum<-function(input,summary){ 
    for(i in seq(1,nrow(summary))){ 
    summary$aggregate[i]<-sum(input[,as.numeric(unlist(str_split(summary$ColIndex[i],',')))])} 
return(summary) 
} 

我要求是僅在並行中運行loopSum中使用的總和,即,我希望一次運行所有總結,從而縮短總時間ta ken用於創建摘要的函數。有沒有辦法做到這一點?

我的實際情況要求我爲摘要data.frame中的每個Summary_name創建數百列的彙總統計信息,我正在尋找最優化的方法來執行此操作。任何幫助深表感謝。

+0

你真的只是拿總和的列嗎?如果是這樣,你會更好地分別總結每列,然後將這些總和加起來。很難知道你要做什麼,因爲'loopSum'函數不起作用。我猜你有一個你沒有包含的自定義'str_split'。 –

+0

當你說'loopSum'不工作,我希望它不會拋出一個錯誤,但沒有返回任何值,(它的工作對我來說)我已經添加了返回現在你可以檢查,並感謝你的colSums的想法,但我的問題在這裏是不是總和不夠快,而是我必須連續運行很多次,我正在尋找一種方法,我可以並行運行所有的總和,理想情況下應該花費更少的時間,一個接一個地運行它們。 – ghub24

回答

1

它是否改善了運行時間?

library(tidyr) 
input1 <- colSums(input) 
summary1 <- separate(summary, "ColIndex", into=c("X1", "X2"), sep=",", convert = TRUE) 
summary$aggregate <- input1[summary1$X1] + input1[summary1$X2] 
+0

謝謝ExperimenteR,如果我必須添加的列數不是一個常數,我如何修改您的答案,因爲在我給出的示例中,它可能會在行之間有所不同,因此在示例中未顯示此內容的道歉 – ghub24

+0

@ ghub24 Can你舉個例子嗎? – ExperimenteR

+0

感謝ExperimentaR,這很有用 – ghub24

相關問題