R dopar foreach在块上而不是每行上

R dopar foreach在块上而不是每行上,r,foreach,data-manipulation,doparallel,R,Foreach,Data Manipulation,Doparallel,这个问题特定于使用foreach和dopar在R中使用并行处理。我创建了一个简单的数据集和一个简单的操作(实际操作更复杂,因此我在这里介绍一个简单的操作)。数据代码和当前代码已发布供您参考 加载包并创建数据 dopar-foreach码 #创建集群并从集群中加载所需的包 图书馆(双平行) cl=makeCluster(3,type=“PSOCK”) 注册数字并行(cl) home1对于您的特定应用程序,我会使用pmap::purr(): home2我不太明白你想要什么。您能提供一些您试图解决问题

这个问题特定于使用foreach和dopar在R中使用并行处理。我创建了一个简单的数据集和一个简单的操作(实际操作更复杂,因此我在这里介绍一个简单的操作)。数据代码和当前代码已发布供您参考

加载包并创建数据 dopar-foreach码
#创建集群并从集群中加载所需的包
图书馆(双平行)
cl=makeCluster(3,type=“PSOCK”)
注册数字并行(cl)

home1对于您的特定应用程序,我会使用
pmap::purr()


home2我不太明白你想要什么。您能提供一些您试图解决问题的代码吗?我不想按数据帧的每一行进行迭代,而是想先按Car_类型创建数据帧的子集,然后运行函数。我唯一无力的尝试是将iter函数中的by=“row”改为by=car\u list(数据创建部分代码的最后一行)。汽车列表只是所有独特汽车的列表。不幸的是,当我这样做时,我得到了以下消息:match.arg(by)中的错误:'arg'必须为NULL或字符向量。我不确定我是否理解您的问题,但您可能希望查看包{dplyr}的函数
group_by
case_(当
时)。@F.PrivéHi Prive。我意识到是什么引起了混乱。请你看一下修改后的问题。我有一列区域(XX,YY,ZZ),我想在不同的集群上运行它们,而不是每行运行代码。这有意义吗。我意识到在上一个版本中,由于我有一列Car_type,并且函数基本上是通过Car_type循环的,所以我的问题有点小问题。你能用dopar appraoch来完成吗?我也有类似的问题
#Creating a mock dataframe
Area =c('XX','YY','ZZ','XX','YY','ZZ','XX','YY','ZZ','YY')
Car_type = c('A','A','B','C','B','C','A','A','B','C')
Variable1=c(.34,.19,.85,.27,.32,.43,.22,.56,.17,.11)
Variable2=c(.76,.3,.16,.24,.47,.23,.87,.27,.43,.59)
Final_data = data.frame(Area,Car_type,Variable1,Variable2)    
#replicate the above 100 times to create a bigger dataset
n =100
Final_data2=do.call("rbind", replicate(n, Final_data, simplify = FALSE))
Final_data2$Final_value = 0
#car_list = unique(Final_data2$Car_type) #have not figured out how to use this
#Create clusters and load required packages the clusters 
library(doParallel)    
cl=makeCluster(3,type="PSOCK") 
registerDoParallel(cl)


home1 <- function(zz1){
  output <- foreach(x = iter(zz1, by = "row"), .combine = rbind, 
                    .packages = "truncnorm") %dopar% {
    if (x$Car_type=='A'){
      x$Final_value = rtruncnorm(1,a=-1,b=1,mean = x$Variable1,sd=x$Variable2)
    } else if(x$Car_type=='B'){
      x$Final_value = rtruncnorm(1,a=-5,b=5,mean = x$Variable1,sd=1)  
    }  else{
      x$Final_value = rtruncnorm(1,a=-10,b=10,mean = 1,sd=1)
    }
    return(x)
  }
  output
}
Final_data3 <- home1(zz1=Final_data2)
stopCluster(cl) #Stop cluster
home2 <- function(Car_type, Variable1, Variable2) {
  if (Car_type=='A'){
    truncnorm::rtruncnorm(1,a=-1,b=1,mean = Variable1,sd=Variable2)
  } else if(Car_type=='B'){
    truncnorm::rtruncnorm(1,a=-5,b=5,mean = Variable1,sd=1)  
  }  else{
    truncnorm::rtruncnorm(1,a=-10,b=10,mean = 1,sd=1)
  }
}

Final_data2$Final_value <- 
  purrr::pmap_dbl(Final_data2[c("Car_type", "Variable1", "Variable2")], home2)
future::plan(future::multiprocess)
Final_data2$Final_value <- 
  furrr::future_pmap_dbl(Final_data2[c("Car_type", "Variable1", "Variable2")], home2)