您可以在不使用sapply
因为qbeta
矢量化的情况下获得结果.我们重复网格值nrow(df)
次数.最后,您将获得一个matrix
行,其行是qbeta
相应行的值data
.注意:考虑到大量的时间,这可能会很慢.除非你并行化或使用更强大的PC,否则不要认为你可以从这里大大加快速度.试一试:
res<-matrix(qbeta(rep(seq(0.0025, 0.9975, by=0.005), each=nrow(data)),data$a, data$b), nrow=nrow(data))
编辑
在这里,我将做一个简单的并行示例.我们使用 doParallel
包.我们将data
data.frame 拆分为一个块列表,然后我们为每个块调用上面的行.从头开始:
#create the data (just 10000 rows) set.seed(1) data<-as.data.frame(matrix(runif(10000,0,1),10000,2,dimnames=list(NULL,letters[1:2]))) #split in 10 1000 rows chunks dataSplit<-split(data,(seq_len(nrow(data))-1)%/%1000) #define the function to make the qbeta calculation qbetaVec<-function(grid,values) matrix(qbeta(rep(grid,each=nrow(values)),values$a,values$b),nrow=nrow(values)) #define the grid grid<-seq(0.0025, 0.9975, by=0.005) #full calculation system.time(res<-qbetaVec(grid,data)) # user system elapsed #5.103 0.007 5.115 #now we parallelize library(doParallel) #set the number of clusters cl <- makeCluster(8) registerDoParallel(cl) #now the calculation with foreach and dopar system.time(res2<-foreach(i=1:10) %dopar% qbetaVec(grid,dataSplit[[i]])) # user system elapsed # 0.026 0.019 1.404 #now we put all together res3<-do.call(rbind,res2) identical(res3,res) #[1] TRUE