首页 > 解决方案 > sapply、mclapply 还是嵌套循环?目标:最快的处理时间

问题描述

您好,谢谢大家看我的问题。

这篇文章的最终目标是确定我输入特定距离值的最快选项,使用行和列名称来识别从小的对称数据框 ( dist.data ) 到大的对称数据框 (final.data) 的相应空间位置。 data),其行名和列名代表特定的观察(有一些观察位于同一位置,这就是两个数据框的尺寸不同的原因)。我正在考虑 sapply、mclapply 和嵌套 for 循环,但是,我愿意接受所有建议。我想找到最快的选择。

我让 sapply 和嵌套 for 循环工作,发现嵌套循环快 2 倍。但是,我没有成功让 mclapply 工作。

#preliminary set up for reproducible example
set.seed(41)

# final df; used in the nested for loop
final.data<-matrix(NA,nrow=100,ncol=100)
  rownames(final.data)<-seq(1:100)
  colnames(final.data)<-rownames(final.data)


#make a symetrical 100 X 100 matrix
dist.data <- matrix(rep(0,10000), nrow=100)
dist.data[lower.tri(dist.data)] <- seq(from=1,to=choose(10,2),by=1)
dist.data <- t(dist.data)
dist.data[lower.tri(dist.data)] <- seq(from=1,to=choose(10,2),by=1)
rownames(dist.data)<-seq(1:100)
colnames(dist.data)<-rownames(dist.data)


# spatial id of each person;allows multiples
spat.ID.test<-sample(1:100, 100, replace=TRUE)

使用 sapply

dummy <- function(row, column){
  return(dist.data[spat.ID.test[row],spat.ID.test[column]])
} 
ptm <- proc.time()
final.data<-as.data.frame(sapply(1:100,function(row) sapply(1:100, function(column) dummy(row,column))))
proc.time() - ptm

使用 mclapply

numCores <- detectCores()
dummy <- function(row, column){
  return(dist.data[spat.ID.test[row],spat.ID.test[column]])
} 
ptm <- proc.time()
final.data<-as.data.frame(mclapply(1:100, function(row) mclapply(1:100, function(column) dummy(row,column),mc.cores = numCores),mc.cores=numCores))
proc.time() - ptm

使用嵌套的 for 循环

ptm <- proc.time()
for (row in 1:100){
  for (column in 1:100){
    #270 is the column for spatialID
    y1<- spat.ID.test[row]   #identifies the spatialID,  in df.full, for the row's respective observation (max of 7079 i.e. the # of unique spatialID)
    x1<- spat.ID.test[column] #identifies the spatialID for the columns's respective observation
    final.data[row,column]=dist.data[y1,x1]    
    }
  }
proc.time() - ptm

谢谢!!

注意:由于输出也将是一个对称矩阵,因此可以求解下(上)三角形,然后将其转置到上(下)三角形。为此,我将列的上限设置为行。但是,我不确定转置它的最佳方法。

标签: rgeospatialnested-loopssapplymclapply

解决方案


推荐阅读