【问题标题】:Directly assign results of doMC (foreach) to data frame直接将doMC(foreach)的结果分配给数据框
【发布时间】:2012-06-28 07:17:44
【问题描述】:

假设我有示例代码

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 以进行进一步处理)。

有什么想法吗?

【问题讨论】:

  • 您希望将 .combine 参数设置为 foreach。看看?foreach,你可以看到例子。
  • 我知道 '.combine' 参数,但是在我看来,这意味着创建另一个向量(带有结果),然后将结果传输到我的初始数据框中。是否可以节省此步骤/时间? (我的数据集很大,迭代次数为 100.000)。谢谢
  • 这似乎是一个使用data.table的好地方。
  • @Andrie 好的,我明白你的意思。我会调查的。谢谢。

标签: r foreach parallel-processing domc


【解决方案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 函数收集它们。您可以编写一个并行的 foreach 循环,将其直接分配给 kkk 变量,但这不会产生任何影响,因为每个分配都会发生在单独的进程中,并且不会与主进程共享。

【讨论】:

  • 感谢您的回答。我知道我不需要为提供的示例循环。我只是写它来介绍这个案例。
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
相关资源
最近更新 更多