【问题标题】:append rows to dataframe using foreach package使用 foreach 包将行附加到数据框
【发布时间】:2013-01-26 18:30:39
【问题描述】:

我在使用并行处理将值附加到数据帧时遇到问题。

我有一个函数会进行一些计算并返回一个数据帧,包括这些计算是随机抽样。

所以我做的是:

randomizex <- function(testdf)
{
    foreach(ind=1:1000)%dopar%
    {
      testdf$X = sample(testdf$X,nrow(testdf), replace=FALSE)
      fit = lm(X ~ Y, testdf)
      newdf <- rbind(newdf, data.frame(pc=ind, err=sum(residuals(fit)^2) ))

    }

return(newdf)
}
resdf = randomizex(mydf)

当我查看resdf的结果时,它是空的

如果我将%dopar% 替换为%do%,则结果计算正确,但速度太慢了..

有什么办法可以提升一点吗??

【问题讨论】:

  • 提醒我们foreachdopar 来自哪里。还有你的mydf - 这样我们就可以重现你的问题。
  • mydf 只是一个随机数据帧,foreach 是一个包,你应该添加library(foreach)library(doMC)registerDoMC()

标签: r foreach parallel-processing


【解决方案1】:

我认为您需要阅读foreach 的文档。您的代码块应该计算单个部分,然后您应该使用.combine 选项来说明如何将它们连接在一起。查看help(foreach) 中的示例以获得更多指导。它不是 for 循环的直接替代品。

例如:

> resultdf = foreach(i=1:10,.combine=rbind)%dopar%{data.frame(x=runif(4),i=i)}
> resultdf
            x  i
1  0.23794248  1
2  0.15536320  1
3  0.58609635  1
4  0.98780497  1
5  0.97806482  2
6  0.92440741  2
7  0.13416121  2
8  0.81598340  2
9  0.13834423  3
[etc]

【讨论】:

  • 好的,谢谢您的回答,但我怎样才能返回结果 df 并在其他地方使用它?它只是被打印到 stdou ..
【解决方案2】:

您需要修改“foreach 循环”,例如:

newdf = foreach(ind=1:1000, .combine=rbind) %dopar%
{
    testdf$X = sample(testdf$X,nrow(testdf), replace=FALSE)
    fit = lm(X ~ Y, testdf)
    data.frame(pc=ind, err=sum(residuals(fit)^2) )
}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2021-11-15
    • 2014-01-08
    • 2019-10-22
    • 2018-05-24
    • 1970-01-01
    • 2018-10-13
    • 2021-06-06
    相关资源
    最近更新 更多