简体   繁体   English

获得带有歧义碱基R的DNA序列的所有可能排列

[英]Get all possible permutations of a DNA sequence with an ambiguous base R

Lets say I have a DNA sequence with an ambiguous base, N , where N can represent any base (its a flex position). 假设我有一个DNA序列,其碱基具有不明确的碱基N ,其中N可以代表任何碱基(它是一个柔性位置)。

dna.seq <- 'ATGCN'

I want a vector of every possible DNA sequence this could represent. 我想要一个可以代表的所有可能的DNA序列的载体。 It would look like: 它看起来像:

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

The solution needs to account for dna sequences with multiple N characters as well, which will create many more potential DNA sequences. 该解决方案还需要考虑具有多个N字符的dna序列,这将产生更多潜在的DNA序列。

CJ from data.table can help you here: 来自data.table CJdata.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"

Flexibility to handle multiple N : 灵活处理多个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"

If you wanted to drop the data.table dependency you could replace tstrsplit with t(strsplit()) and CJ with expand.grid ; 如果要删除data.table依赖项,则可以将tstrsplit替换为t(strsplit()) ,将CJ替换为expand.grid you'll just be sacrificing computational speed. 您只会牺牲计算速度。

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"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM