如何解决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 举报,一经查实,本站将立刻删除。