R sapply、McLappy或嵌套循环?目标:最快的处理时间

R sapply、McLappy或嵌套循环?目标:最快的处理时间,r,geospatial,nested-loops,sapply,mclapply,R,Geospatial,Nested Loops,Sapply,Mclapply,大家好,谢谢大家看我的问题 这篇文章的最终目标是确定我输入特定距离值的最快选项,使用行名和列名来标识从小型对称数据框(dist.data)到大型对称数据框(final.data)的各自空间位置其行和列名表示特定的观测值(有些观测值位于同一位置,这就是两个数据帧的尺寸不同的原因)。我正在考虑Sappy、McLappy和嵌套for循环,但是,我愿意接受所有建议。我想找到最快的选择 我让Sappy和nested for循环工作,发现嵌套循环快了2倍。然而,我没有成功地让McLappy开始工作 #pre

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

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

我让Sappy和nested for循环工作,发现嵌套循环快了2倍。然而,我没有成功地让McLappy开始工作

#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)
#可复制示例的初步设置
种子(41)
#最终df;在嵌套for循环中使用

final.data如果您正在寻找最快的处理时间,那么使用
Rcpp
的嵌套循环可能是无与伦比的,请参阅不确定是否是无与伦比的(C和.Call()中的嵌套循环可能更快)。但我也建议使用Rcpp解决方案,因为这非常方便。但只要用“微基准”做一些测试就可以找到赢家:)
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
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
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