Запись вложенных циклов с помощью apply / lapply и т. Д. - PullRequest
1 голос
/ 15 апреля 2020

Я сейчас изучаю R, но наткнулся на некоторые проблемы, особенно для циклов for. Я думаю, что это не лучший стиль для использования циклов в R, но вместо этого используйте apply / lapply et c. Я пытаюсь создать все возможные пары последовательностей, которые различаются ровно в одной позиции. В каждой строке у меня есть 2 столбца, из этих двух я извлекаю уникальные последовательности. Затем я сравниваю каждую последовательность со всеми остальными последовательностями, и если они отличаются ровно на одну позицию, я добавляю их в all_pairs. После сравнения всех последовательностей я записываю all_pairs в новый столбец и go в следующий ряд. Код работает, но он очень медленный, он занимает около 10 минут при использовании только 1% моего процессора. Каков был бы лучший способ улучшить скорость? Я записал первые 5 строк моего data_filtered в конце кода вместе с выводом первых 2 строк. Любая помощь приветствуется. Так как это мой первый пост на Stackoverflow, не стесняйтесь рассказать, что я могу сделать лучше (форматирование и т. Д. c.).

#Write function to compute string difference
string_diff <- function(string1, string2){
  return (sum(unlist(strsplit(string1,"")) != unlist(strsplit(string2, ""))))
}

for (row in 1:nrow(data_filtered)){
  #Get all unique sequences in a row
  UniqSeq <- unique(c(unlist(strsplit(data_filtered[row, "UniqueSeq"], "-")), data_filtered[row, "Seq8mer"]))
  all_pairs <- character()
  #Loop over all sequences and compair number of nucleotide differences
  for (first in 1:(length(UniqSeq)-1)){
    for (second in (first+1):length(UniqSeq)){
      str1 <- UniqSeq[first]
      str1_rev_comp <- paste(toupper(rev(comp(unlist(strsplit(str1, ""))))), collapse="")
      str2 <- UniqSeq[second]
      str2_rev_comp <- paste(toupper(rev(comp(unlist(strsplit(str2, ""))))), collapse="")
      #If only differ in 1 position, add to all_pairs
      if((string_diff(str1, str2) == 1) || (string_diff(str1_rev_comp, str2) == 1) || (string_diff(str1, str2_rev_comp) == 1) || (string_diff(str1_rev_comp, str2_rev_comp) == 1)){
        all_pairs <- c(all_pairs, paste(str1, str2, sep ="-"))
      }
    }
  }
  print(row)
  #Add all pairs to Pairs column
  data_filtered$Pairs[row] <- list(all_pairs)
}

data_filtered[c(1:5),c(1,2)]
                                      UniqueSeq  Seq8mer
6                    ACAAAAAT-ACAAAATT-ACAAAAGT ACAAAAAT
7                    AAAATCAC-AAAATTAC-AAAATCAT AAAATCAC
8  ATTTTCTA-TTTTTCTA-ATTTTCAA-ATCTTCTA-TTATTCTA ATTTTCTA
11                   AAGAAGAT-AAGAAGGT-AAGGAGAT AAGAAGAT
13                   ACAAAAAT-ACAAAATT-AGAAAATT ACAAAAAT

data_filtered[c(1,2),3]
[[1]]
[1] "ACAAAAAT-ACAAAATT" "ACAAAAAT-ACAAAAGT" "ACAAAATT-ACAAAAGT"

[[2]]
[1] "AAAATCAC-AAAATTAC" "AAAATCAC-AAAATCAT"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...