Я сейчас изучаю 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"