让我说我有示例代码
kkk<-data.frame(m.mean=1:1000, m.sd=1:1000/20)
kkk[,3:502]<-NA
for (i in 1:nrow(kkk)){
kkk[i,3:502]<-rnorm(n=500, mean=kkk[i,1], sd=kkk[i,2])
}
我想将此函数转换为与doMC
并行运行。我的问题是foreach
导致列表,而我需要每次迭代的结果是一个向量,然后可以转移到数据框(稍后将导出为CVS进行进一步处理)。
有什么想法吗?
答案 0 :(得分:1)
你不需要一个循环,并且在数据框中放置一个大的数字矩阵只是为了处理矩阵是低效的(尽管你可能需要在结束后创建一个数据框 为了写入CSV文件而进行所有数学运算。)
m.mean <- 1:1000
m.sd <- 1:1000/20
num.columns <- 500
x <- matrix(nrow=length(m.mean), ncol=num.columns,
data=rnorm(n=length(m.mean) * num.columns))
x <- x * cbind(m.sd)[,rep(1,num.columns)] + cbind(m.mean)[,rep(1,num.columns)]
kkk <- data.frame(m.mean=m.mean, m.sd=m.sd, unname(x))
write.csv(kkk, "kkk.txt")
要回答关于直接将结果从foreach循环分配给现有数据结构的原始问题,这是不可能的。 foreach包的并行后端设计用于在单独的R进程中执行每个计算,因此每个进程必须向父进程返回一个单独的对象,父进程使用提供给foreach的.combine
函数收集它们。您可以编写一个直接分配给kkk
变量的并行foreach循环,但它不起作用,因为每个赋值都会在单独的进程中发生,并且不会与主进程共享。