我需要创建巨大的 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 函数应该是最快的,但也许不是..
感谢任何人...