2010-08-31 59 views
3

我目前運行的多個應用該是這樣的線路:提取lapply或mclapply導致

test=data.frame(t=seq(1,5,1),e=seq(6,10,1)) 
mean(apply(test,2,mean)) 

我想第二線轉換爲mclapply其作爲lapply產生相同的結果。我意識到我可以使用for循環從lapply語句中提取每個項目,然後在該向量上使用mean,但這會降低我嘗試通過使用mclapply來提高性能。問題是lapply和mcapply返回一個意味着無法使用的列表。我可以使用[[]]獲取實際值或測試$ t並測試$ e,但測試中的列數是可變的,並且通常超過1,000。必須有一個更簡單的方法來處理這個問題。基本上我想要得到這種說法的意思:

mclapply(test,mean,mc.preschedule=TRUE) 

最好不生成新變量或使用for循環。該解決方案應該是相當於讓這句話的意思是:

lapply(test,mean) 

回答

2

我很困惑 - 一個data.frame是所有list以及之後。因此,除了明顯的

R> testdf <- data.frame(t=seq(1,5,1),e=seq(6,10,1)) 
R> mean(testdf) 
t e 
3 8 
R> mean(mean(testdf)) 
[1] 5.5 
R> 

你也可以做

R> lapply(testdf, mean) 
$t 
[1] 3 

$e 
[1] 8 

R> mean(unlist(lapply(testdf, mean))) 
[1] 5.5 
R> 

於是就有了內lapply根據需要,不,你可以使用mclapply

+0

使用mclapply會的目的,把6個小時的模擬到3個小時的模擬所以平均值(平均值(測試))優雅不會加速模擬。未列出的解決方案正是我需要的!非常感謝!現在我可以用mclapply替換lapply,並且將我的模擬時間縮短一半! – ProbablePattern 2010-08-31 21:42:46

+0

「現在我可以用mclapply替換lapply,並將模擬時間縮短一半!」也許。記住並行化某些東西需要固定成本;線程需要啓動,等等。 – Vince 2010-08-31 21:56:05

+0

是的,'mean(mean(testdf))'僅僅是爲了確定你沒有顯示的整體意思。我知道這是一個程式化的例子。很高興得到了幫助。 – 2010-08-31 21:57:56

0

我喜歡把mclapply()結果列表中,然後結合這些列表以形成最終的產品:

results.list <- list() 
results.list <- mclapply(listOfData, analysisFunction, mc.cores = 7) 

library(data.table) 
result <- rbindlist(results.list)