2014-11-22 65 views
2

我想使用doParallel包對R中的大數據幀執行一些並行處理。讓我們調用數據框mydata。我想遍歷按行數據幀,所以像R:使用doParallel將若干行並行處理在一起

foreach(x=iter(mydata, by='row')) %dopar%{ 
    ... do stuff ... 
} 

但是,那不是很正確,因爲在每一個循環,我需要有機會獲得幾行。假設變量idx包含哪些行需要一起處理的信息。比方說idx是一個矩陣,看起來像

1 2 3 
10 12 14 
4 7 9 
... 

每一行表示mydata需要一起處理的行。我怎樣才能使用doParallel包來做到這一點?

編輯:我看到我可以發送「塊」data.frame使用iblkcol有沒有辦法發送我選擇的非連續塊?

編輯:我結束了使用自定義iteraor:基於

apply(idx,1,function(idx) list(mydata[idx,])) 

然後

> data <- data.frame(A=sample(letters,10),B=rnorm(10)) 
> data 
    A   B 
1 z 0.5105797 
2 h 1.2559502 
3 a 0.9697254 
4 n -1.4189076 
5 e -0.5800640 
6 b 0.2907486 
7 q -2.4414012 
8 d 1.8146928 
9 v 0.2510003 
10 x -0.2011185 
> idx <- list(c(1,2),c(4,5),c(3,6,7),c(8,9,10)) 
> 
> library(iterators) 
> 
> ialn <- function(x, idx){ 
+ it <- iter(idx) 
+ nextEl <- function(){ 
+  n <- nextElem(it) 
+  x[n,] 
+ } 
+ obj <- list(nextElem=nextEl) 
+ class(obj)<- c('ialn','abstractiter','iter') 
+ obj 
+ } 
> 
> 
> it <- ialn(data,idx) 
> nextElem(it) 
    A   B 
1 z 0.5105797 
2 h 1.2559502 
> nextElem(it) 
    A   B 
4 n -1.418908 
5 e -0.580064 

回答

1

也許分裂MYDATA成一個列表,通過在foreach發送該名單?

可以是一個或custom iterator,它基於行索引獲取數據。

+0

謝謝!使用自定義迭代器,我能夠得到我想要的。 – bdeonovic 2014-11-23 23:49:35