r - 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
谢谢!!
注意:由于输出也将是一个对称矩阵,因此可以求解下(上)三角形,然后将其转置到上(下)三角形。为此,我将列的上限设置为行。但是,我不确定转置它的最佳方法。
解决方案
推荐阅读
- javascript - 在 React Redux Saga 中,API 在循环中被多次调用
- java - 使用 OpenJDK 11 读取带有蓝色棱镜(java 模式)的表时出错
- cocoa - PDFDocument 可能存在的编码问题
- node.js - 使用nodejs和rest api调用和express进行异步处理-序列错误
- python - Ansible 和 Opennebula:这个模块需要 pyone 才能工作
- android - 具有 Android 架构导航的动态功能模块之间的 startActivityForResult()
- python-3.x - 在 Python 中将十六进制数据转换为可读字符串
- wordpress - 将 API 请求重定向到子域 htaccess
- selenium - 当单独运行 appium 测试脚本时,它们运行良好,但是当它们一起运行时,它们会抛出错误
- r - R6 传递一个 self$FUN 作为参数