【问题标题】:Output list of two rbinded data frames with foreach in RR中带有foreach的两个rbind数据帧的输出列表
【发布时间】:2015-02-01 10:55:44
【问题描述】:

假设我想在doParallel 包中使用foreach 来返回两个不同维度的数据框的列表,如下所示:

a<-NULL
b<-NULL
for(i in 1:100){
  a<-rbind(a,data.frame(input=i,output=i/2))
  if(i > 5){
    b<-rbind(b,data.frame(input=i,output=i^2))
  }
}
list(a,b)

由于foreach返回一个对象,因此(至少对我而言)没有明显的方法可以使用foreach 完成上述操作。

注意:这是我实际正在处理的问题的一个非常简化的版本,因此使用 lapply (或类似的东西)解决问题将不起作用。我的问题的精神是如何使用foreach 做到这一点。

【问题讨论】:

    标签: r for-loop parallel-processing parallel-foreach


    【解决方案1】:

    在 NewNameStat 的回答中添加 data.table rbindlist 版本:

    #takes an arbitrary number of lists x all of which much have the same structure    
    comb <- function(x, ...) {  
          mapply(rbind,x,...,SIMPLIFY=FALSE)
    }
    
    foreach(i=1:10, 
            .combine=function(x,...) mapply(function(...) data.table::rbindlist(list(...), fill = TRUE),x,...,SIMPLIFY=FALSE)) 
          %dopar% {
          a<-rbindlist(list(a,data.table(input=i,output=i/2)))
          if(i > 5){
            b<-rbindlist(list(b,data.table(input=i,output=i^2)))
          }
          list(a,b)
    }
    

    【讨论】:

      【解决方案2】:

      我想通了。您必须定义自己的函数,以完全按照您想要的方式组合列表。

      #takes an arbitrary number of lists x all of which much have the same structure    
      comb <- function(x, ...) {  
            mapply(rbind,x,...,SIMPLIFY=FALSE)
      }
      
      foreach(i=1:10, .combine='comb') %dopar% {
            a<-rbind(a,data.frame(input=i,output=i/2))
            if(i > 5){
              b<-rbind(b,data.frame(input=i,output=i^2))
            }
            list(a,b)
      }
      

      【讨论】:

      • 我喜欢你的 combine 函数,但我认为你需要从 foreach 循环体中删除 rbind 调用。此外,如果您使用 foreach .multicombine=TRUE 选项,效率会更高,因为在您的示例中,comb 将被调用一次而不是 9 次。
      • 我们怎样才能改变comb函数只返回unique值?
      猜你喜欢
      • 2022-10-02
      • 2018-10-17
      • 2019-11-05
      • 2010-12-11
      • 2018-06-21
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多