sapply,mclapply还是嵌套循环?目标:最快的处理时间

问题描述

您好,谢谢大家关注我的问题。

这篇文章的最终目标是使用行和列名称来识别我输入输入特定距离值的最快方法,这些名称一个小的对称数据框中识别相应的空间位置( dist.data ) ,放入一个大型对称数据框( final.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,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,spat.ID.test[column]])
} 
ptm <- proc.time()
final.data<-as.data.frame(mclapply(1:100,function(row) mclapply(1:100,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

谢谢!

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)