我正在尝试修改包含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语句的情况下获得第一个结果?
感谢您的帮助! 学家
答案 0 :(得分:0)
如果您完全删除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
}