#r #parallel-processing
#r #параллельная обработка
Вопрос:
Я пытаюсь изменить большую матрицу, содержащую значения 0,1,2, и заменить 2 на 1. Матрица содержит 500.000 столбцов и 7000 строк. Данные уже считаны по 50 строкам, и теперь я хочу разбить их на блоки и многопоточность, используя foreach() %dopar%.
> 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)
}
}
с помощью инструкции print(a) возвращаемая переменная res представляет собой матрицу из n на x, в которой все 2 заменены на 1.
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
Однако без инструкции print(a) возвращаемая переменная res представляет собой матрицу размером 1 на x, содержащую только значение 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
Как мне получить первый результат без использования инструкции print?
Спасибо за помощь! J.
Ответ №1:
Если вы полностью удалите print(a)
a[a==2] <- 1
строку, возвращается 1. Вот почему вы должны использовать a
вместо print(a)
res = foreach(SNP=1:ncol(snpchunk), .combine='cbind') %dopar%
{
a = snpchunk[,SNP]
a[a==2] <- 1
a
}