如何在R中使用foreach创建嵌套循环?

5kgi1eie  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(196)

我没能设计出正确的代码来使用foreach运行嵌套循环。我使用了一个巨大的数据集,所以这里需要并行化。
我需要随机抽样1/4的数据集,不替换4次(所以整个数据集是重新抽样),并计算相关系数和p值为每对变量4次。我一直在工作的代码如下,我的目标是一个输出看起来像这样(与rbinding每个输出从每个季度抽样)。

#from one of the quarters
      estimate  pvalue  Var1 Var2
      0.678     0.03    a     b
      0.754     0.04    a     b
      0.546     0.01    a     b
      0.567     0.03    a     b
     -0.234     0.14    a     c
     -0.321     0.34    a     c
     -0.456     0.43    a     c
     -0.456     0.52    a     c
      

      x <- colnames(df)
      df_use <- data.frame(t(combn(x,2)), stringsAsFactors=F)
      a <- 1/4 

    registerDoParallel(cl <- makeCluster(6))

 res <-
  foreach(i=1:4, .combine='rbind') %:%
     foreach(j=1:nrow(df.2), .combine='rbind', .packages=c("magrittr",  "dplyr")) %dopar% {
 df.2 = dplyr::sample_frac(df_use, a, replace = FALSE)
   out.frac = broom::tidy(cor.test(prac4[,df.2[j,1]],
                                   prac4[,df.2[j,2]],
                       method = "spearman")) %>% 
         mutate(Var1=df.2[j,1], Var2=df.2[j,2])
 c(out.frac$estimate, out.frac$p.value, out.frac$Var1, out.frac$Var2)
}

任何帮助或指导将不胜感激!
编辑:以上所做的一切都是将主df_use分为4,然后将每对变量的相关系数和p值重复4次(它们完全相同,不太可能是每对测试的情况)。
目的是随机抽样任意配对数据集值的1/4(当考虑两个变量之间的相关性时),并重复4次,因此不太可能对该大型数据集中测试的每两个变量重复完全相同的相关性和p值。

eimct9ow

eimct9ow1#

我会处理它在一个简单的方式比上面,因为我不是100%肯定,如果你是使用1/4th每次你这样做4次或你这样做的每1/4th为所有4次运行,它可能需要调整。
但我的流程是

这在某些地方是伪代码,因为你的代码很难解析出来。

但是你需要弄清楚如何设置你的数据分析,这也可以通过一个函数来完成,这个函数获取大量的样本,调用plan(),然后使用assign来创建数据样本,并输出等于采样数量的数据,你可以决定细节。
但是一般来说,我会不惜一切代价避免循环,使用future可以启动一个线程,并允许R在最后一个任务完成之前转移到另一个处理任务

require(future)
sampling_function<- function(df){data%>%
             sample=sample_frac( size = .25, replace = FALSE)
             return(sample)}
plan(multiprocess) #allows for parallelization

d1<-sampling_function(df)
out1<-analysis_code(d1) #will run and R will move on to next line in new thread

d2<-sampling_function(df)
out2<-analysis_code(d2) #will run and R will move on to next line in new thread

d3<-sampling_function(df)
out3<-analysis_code(d3) #will run and R will move on to next line in new thread

d4<-sampling_function(d4)
out4<-analysis_code(d1) #will run and R will move on to next line in new thread

然后你可以把你的输出绑定在一起。就像我说的,我认为如果你对你正在做的事情有更强的感觉(相对于每遍一个子样本或者每遍4个排列子样本),你也可以创建一个函数来设置并行化。
您甚至可以将rbind或输出的dataframe聚合包含到您编写的函数中,因为如果之前请求的某个任务尚未完成,R将使用future方法等待它完成。

相关问题