Как распараллелить 4 вложенных цикла в R на Windows - PullRequest
0 голосов
/ 24 апреля 2020

Я использовал этот код для сравнения всех генов друг с другом. Функция кода, но главная проблема в том, что выполнение медленное. Есть ли способ сделать этот код быстрее? Есть четыре вложенных l oop, но я не понимаю, как сделать этот код параллельно.

Id_GeneNameTwoGenes <- Id_GeneName3[1:10,]

cl <- makeCluster(detectCores()-1)
registerDoParallel(cl)

system.time({
 n   <- nrow(Id_GeneNameTwoGenes)
 clusterExport(cl,"n")
 nms <- rownames(Id_GeneNameTwoGenes)
 clusterExport(cl,"nms")
 V1  <- rep(nms[1:(n-1)],seq(from=n-1, to = 1, by = -1))
 clusterExport(cl,"V1")
 V2  <- unlist(parLapply(cl,1:(n-1), function(i)(nms[(i+1):n])))
 clusterExport(cl,"V2")

 weight <- unlist(lapply(1:(n-1), function(i) (
   sapply((i+1):n, function(j) {
       rowx <- Id_GeneNameTwoGenes[i,colnames(Id_GeneNameTwoGenes[i,which(Id_GeneNameTwoGenes[i,] == 1 & colnames(Id_GeneNameTwoGenes) != "ENTREZID")])]
       rowy <- Id_GeneNameTwoGenes[j,colnames(Id_GeneNameTwoGenes[j,which(Id_GeneNameTwoGenes[j,] == 1 & colnames(Id_GeneNameTwoGenes) != "ENTREZID")])]

       weight2 <- unlist(lapply(1:ncol(rowx), function(k) (
          sapply(1:ncol(rowy), function(w) {
          sh <- distance.matrix[colnames(rowx[k]),colnames(rowy[w])]
          if ( sh != "Inf")
            sh
          else 
            NA

       })
   )))

      mean(weight2, na.rm = TRUE)
   })
)))

similarity.matrix <- data.frame(source=Id_GeneNameTwoGenes[V1,1],dest=Id_GeneNameTwoGenes[V2,1],weight=weight)


q <- quantile(unlist(similarity.matrix), probs = c(.25, .5, .75))
filter.matrix.25 <- similarity.matrix[which(similarity.matrix$weight >= q[1]),]
filter.matrix.50 <- similarity.matrix[which(similarity.matrix$weight >= q[2]),]
filter.matrix.75 <- similarity.matrix[which(similarity.matrix$weight >= q[3]),]
})

registerDoSEQ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...