Получите все возможные перестановки последовательности ДНК с неоднозначным основанием R - PullRequest
0 голосов
/ 15 января 2019

Допустим, у меня есть последовательность ДНК с неоднозначным основанием, N, где N может представлять любое основание (его гибкое положение).

dna.seq <- 'ATGCN'

Мне нужен вектор каждой возможной последовательности ДНК, которую это может представлять. Это будет выглядеть так:

c('ATGCA','ATGCT','ATGCG','ATGCC')

Решение также должно учитывать последовательности ДНК с несколькими N символами, что создаст гораздо больше потенциальных последовательностей ДНК.

Ответы [ 2 ]

0 голосов
/ 15 января 2019
dna.seq <- 'ATNGCN'
dna.seq.copy = dna.seq
while(grepl("N", dna.seq.copy[1])){
    dna.seq.copy = as.vector(sapply(c("A", "C", "T", "G"), function(x) sub("N", x, dna.seq.copy)))
}
dna.seq.copy
# [1] "ATAGCA" "ATCGCA" "ATTGCA" "ATGGCA" "ATAGCC" "ATCGCC" "ATTGCC" "ATGGCC" "ATAGCT" "ATCGCT" "ATTGCT" "ATGGCT" "ATAGCG" "ATCGCG" "ATTGCG"
#[16] "ATGGCG"
0 голосов
/ 15 января 2019

CJ из data.table может помочь вам здесь:

library(data.table)
dna.seq <- 'ATGCN'

# split into components
l = tstrsplit(dna.seq, '', fixed = TRUE)

# replace N with all possibilities
all_bases = c('A', 'T', 'C', 'G')
l = lapply(l, function(x) if (x == 'N') all_bases else x)

# use CJ and reduce to strings:
Reduce(paste0, do.call(CJ, l))
# [1] "ATGCA" "ATGCC" "ATGCG" "ATGCT"

Гибкость для обработки нескольких N:

dna.seq <- 'ATNCN'
Reduce(paste0, do.call(CJ, l))
#  [1] "ATACA" "ATACC" "ATACG" "ATACT" "ATCCA" "ATCCC" "ATCCG" "ATCCT"
#  [9] "ATGCA" "ATGCC" "ATGCG" "ATGCT" "ATTCA" "ATTCC" "ATTCG" "ATTCT"

Если вы хотите удалить зависимость data.table, вы можете заменить tstrsplit на t(strsplit()) и CJ на expand.grid; вы просто пожертвуете вычислительной скоростью.

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