2016-10-03 10 views
1

Ich versuche, eine große Matrix mit 0,1,2 Werte zu ändern und die 2 durch 1 zu ersetzen. Die Matrix enthält 500.000 Spalten und 7000 Zeilen. Die Daten sind bereits in 50 Zeilen eingelesen und nun möchte ich sie in Blöcke und Multithreads unter Verwendung von foreach()% dopar% aufteilen.parallel in R Problem

> SNPchunk 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 0 0 0 0 1 0 0 2  
[2,] 1 0 1 0 1 1 1 0  
[3,] 1 0 1 0 1 1 0 1 
[4,] 0 0 0 0 1 0 0 2  
[5,] 0 0 0 0 2 0 2 1  
[6,] 0 0 0 0 0 0 0 1 
[7,] 0 0 0 0 1 0 0 2 
[8,] 0 0 0 0 2 0 1 1 
[9,] 1 1 1 0 1 1 0 1 
[10,] 0 0 0 0 1 0 1 1  

chunk = foreach (part = 1:snpsplit) %do% 
{ 
    snpchunk = SNPcomponents[,snp.start[part]:snp.stop[part]] 

    #print(part) 

    res = foreach(SNP=1:ncol(snpchunk), .combine='cbind') %dopar% 
    { 
     a = snpchunk[,SNP] 
     a[a==2] <- 1 
     print(a) 
    }   
} 

mit dem Druck (a) -Anweisung die zurück variable res ist eine Matrix von n von x mit allen durch 1s 2s ersetzt.

 result.1 result.2 result.3 result.4 result.5 result.6 result.7 result.8 
[1,]  0  1  1  1  0  1  1  1 
[2,]  0  0  0  0  0  0  0  0 
[3,]  1  0  0  0  0  0  0  0 
[4,]  0  0  0  0  0  0  1  1 
[5,]  0  1  1  1  0  0  1  1 
[6,]  1  0  1  1  0  1  1  1 
[7,]  0  1  1  1  0  0  1  1 
[8,]  0  1  0  0  1  1  1  1 
[9,]  0  0  0  0  0  0  0  0 
[10,]  1  1  0  0  0  0  0  1 

jedoch ohne den Druck (a) Erklärung der zurückgegebenen Variablen res eine Matrix von 1 durch x nur den Wert 1.

>res 
result.1 result.2 result.3 result.4 result.5 result.6 result.7 result.8 
    1  1  1  1  1  1  1  1 

enthält, Wie kann ich das erste Ergebnis erhalten ohne die Druckanweisung zu verwenden?

Vielen Dank für Ihre Hilfe! J.

Antwort

0

Wenn Sie vollständig entfernen print(a) die a[a==2] <- 1 Linie 1 zurückgibt, das ist, warum Sie a statt print(a)

res = foreach(SNP=1:ncol(snpchunk), .combine='cbind') %dopar% 
{ 
    a = snpchunk[,SNP] 
    a[a==2] <- 1 
    a 
}   
verwenden sollten