【问题标题】:Optimize and append values to dataframe with foreach R使用 foreach R 优化并将值附加到数据帧
【发布时间】:2021-11-15 10:38:32
【问题描述】:

我想通过将嵌套 for 循环与 foreach 包并行化来优化它们。我是这个主题的新手,我尝试了几种方法将值附加到数据框。我知道 for 循环在返回一个值时有些问题,但我想组合这些值并将它们存储到数据框中。我试图用 foreach 循环替换遍历行的 for 循环,但我无法使其工作。这个想法是为了更好地理解并行化 for 循环。

library(foreach)
library(doParallel)

cl <- makeCluster(2)
registerDoParallel(cl)

df <- data.frame(x=sample(10), y=sample(10), z = sample(10))
repeats <- 2

FUN <- function(df, repeats) {

   foreach(k=1:repeats, .combine = 'rbind') %dopar% {

       for(i in 1:nrow(df)) {
  
          for(j in 1:ncol(df)) {
    
             c(k=k ,i=i ,j=j , value=df[i, 1] * j )
    
          }
       }
    } 
}


FUN(df, repeat)
stopCluster(cl)

如前所述,我尝试将 for 循环替换为 foreach。同样,这些值没有正确存储。

foreach(k=1:repeats, .combine = 'rbind') %:% {

       foreach(i=1:nrow(df), .combine = 'c') %dopar%{
  
          for(j in 1:ncol(df)) {
    
             c(k=k ,i=i ,j=j , value=df[i, 1] * j )
    
          }
       }
    } 

输出示例

  k i j value
  1 1 1 3
  1 1 2 6

【问题讨论】:

    标签: r foreach parallel.foreach


    【解决方案1】:

    foreach 有一个用于嵌套循环的特殊语法(参见 vignette("nested"):

    FUN <- function(df, repeats) {
      
      foreach(k=1:repeats, .combine = 'rbind') %:%
        foreach(i = 1:nrow(df), .combine = 'rbind') %:%
        foreach(j = 1:ncol(df),  .combine = 'rbind') %dopar% {
          
          c(k=k ,i=i ,j=j , value=df[i, 1] * j )
          
        }
    }
    `rownames<-`(FUN(df, repeats), NULL)
    

    我的输出比你的长,所以我不确定你想要什么。此外,每当您提供使用随机数据的示例时,请使用 set.seed。所以我们每次都会得到相同的结果。

    【讨论】:

    • 感谢您分享您的意见,我正在照顾这个!是的,我只是提供了预期输出的快照。
    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多