1

我需要创建巨大的 data.frame 组合,但我不需要全部。但正如我在这里看到的,expand.grid 函数无法添加组合抛出的特定条件。

所以我决定一步一步走。例如我有

variants<-9 # number of possible variants
aa<-c(0:variants) # vector of possible variants
ab<-c(0:variants)
ac<-c(0:variants)
ad<-c(0:variants)
ae<-c(0:variants)
af<-c(0:variants)
ag<-c(0:variants)
ah<-c(0:variants)
ai<-c(0:variants)
aj<-c(0:variants)

如果我尝试

expand.grid(aa,ab,ac,ad,ae,af,ag,ah,ai,aj)

“无法分配大小向量”问题来了..

所以我试着一步一步走

step<-2 # it is a condition for subsetting the grid
grid_2<-expand.grid(aa,ab)
sub_grid_2<-grid_2[abs(grid_2[,1]-grid_2[,2])<=step,]

这给了我需要的组合。为了节省内存,我添加了另一列,例如

  fun_grid_list_3<-function(x){
  a<-sub_grid_2[x,1]
  b<-sub_grid_2[x,2]
  d<-rep(c(1:variants))
  c<-data.frame(Var1=rep(a,variants),Var2=rep(b,variants),Var3=d)
  return(c)
}

    sublist_grid_3<-mclapply(c(1:nrow(sub_grid_2)),fun_grid_list_3,mc.cores=detectCores(),mc.preschedule=FALSE)
sub_grid_3=ldply(sublist_grid_3)

但是当我遇到 8 个或更多变量的网格时,问题就来了。这需要很多时间,但它应该只是在另一个框架中添加一个数字。也许我错了,它确实需要那个时间,但我希望有一种更有效的方法来做到这一点。

我只需要创建 2 个变量的 expand.grid,然后将条件添加到子集。然后添加另一个尊重子集网格的列(将 c(0:variants) 添加到每一行,这意味着当然要创建更多行......然后按条件对其进行子集等等......

任何人都可以帮助使其更快吗?我希望使用 mclapply trought 函数应该是最快的,但也许不是..

感谢任何人...

4

0 回答 0