2014-01-08 2 views
0

У меня есть следующий код (вложенный в цикл) в R, который очень медленный. Цикл соответствует значениям из двух столбцов. Затем подбирает соответствующий файл и выполняет итерацию через файл, чтобы найти совпадение. Затем он берет эту строку из файла. Итерации могут увеличиться до более чем 100 000. Пожалуйста, если кто-то может дать представление о том, как ускорить процесс.Выполнение вложенного цикла выполняется быстрее в R

for(i in 1: length(Jaspar_ids_in_Network)) { 
    m <- Jaspar_ids_in_Network[i] 
    gene_ids <- as.character(GeneTFS$GeneIds[i]) 
    gene_names <- as.character(GeneTFS$Genes[i]) 

    print("i") 
    print(i) 

    for(j in 1: length(Jaspar_ids_in_Exp)) { 
    l <- Jaspar_ids_in_Exp[j] 
    print("j") 
    print(j) 

    if (m == l) { 
     check <- as.matrix(read.csv(file=paste0(dirpath,listoffiles[j]),sep=",",header=FALSE)) 
     data_check <- data.frame(check) 
     for(k in 1: nrow(data_check)) { 
     gene_ids_JF <- as.character(data_check[k,3]) 
     genenames_JF <- as.character(data_check[k,4]) 

     if(gene_ids_JF == gene_ids) { 
      GeneTFS$Source[i] <- as.character(data_check[k,3]) 
      data1 <- rbind(data1, cbind(as.character(data_check[k,3]), 
             as.character(data_check[k,8]), 
             as.character(data_check[k,9]), 
             as.character(data_check[k,6]), 
             as.character(data_check[k,7]), 
             as.character(data_check[k,5]))) 
     } else if (toupper(genenames_JF) == toupper(gene_names)) { 
      GeneTFS$Source[i] <- as.character(data_check[k,4]) 
      data1 <- rbind(data1, cbind(as.character(data_check[k,4]), 
             as.character(data_check[k,5]), 
             as.character(data_check[k,6]), 
             as.character(data_check[k,7]), 
             as.character(data_check[k,8]), 
             as.character(data_check[k,2]))) 
     } else { 
     # GeneTFS[i,4] <- "No Evidence"  
     } 
     } 
    } else { 
     # GeneTFS[i,4] <- "Record Not Found"   
    } 
    } 
} 
+0

Прежде всего, читать во всех файлах и поместить их в список (и, возможно, 'rbind' их в один большой data.frame). Тогда вы, вероятно, можете использовать 'merge' или использовать пакет data.table и его объединения. Суть в том, что вы не должны использовать любые циклы 'for'. Но если вы это сделаете, вы определенно не должны расти в нем. Больше не могу сказать, так как ваш пример не является [воспроизводимым] (http://stackoverflow.com/a/5963610/1412059). – Roland

+0

Комментарий моего профессора о R: Никогда не используйте петли! –

+0

Можете ли вы предложить, как их заменить. У меня мало знаний в R – user2498657

ответ

0

Если вы вытащите логику для обработки одной пары в функцию, f(m,l), то вы могли бы заменить двойную петлю с:

outer(Jaspar_ids_in_Network, Jaspar_ids_in_Exp, Vectorize(f)) 
Смежные вопросы