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
; вы просто пожертвуете вычислительной скоростью.