开发核苷酸序列

时间:2018-02-20 09:43:52

标签: r regex bioinformatics dna-sequence

我想开发这种形式的表达式:

a <- "[AGAT]5GAT[AGAT]7[AGAC]6AGAT"

我想像这样转换表达式:

b <- "AGATAGATAGATAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGACAGACAGACAGACAGACAGACAGAT"

如您所见,挂钩后的数字表示找到模式的次数。

目前我使用sub(".*[*(.*?) *].*", "\\1", seq)[]replicate(i, "my_string")之间选择字符作为[]之间的复制序列,但我找不到如何使其与我的数据一起使用。

我希望非常清楚。

2 个答案:

答案 0 :(得分:3)

我们使用gsub创建1,其中[('a1')之前没有数字,然后分别提取字母和数字('v1','v2'),执行将strreppaste子串复制到单个字符串('res')

library(stringr)
a1 <- gsub("(?<![0-9])\\[", "1[", a, perl = TRUE)
v1 <- str_extract_all(a1, '[A-Z]+')[[1]]
v2 <- str_extract_all(a1, "[0-9]+")[[1]]
res <- paste(strrep(v1, as.numeric(c(tail(v2, -1), v2[1]))), collapse='')
res

-output

#[1] "AGATAGATAGATAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGACAGACAGACAGACAGACAGACAGAT"

- 使用'b'检查

identical(res, b)
#[1] TRUE

稍微更紧凑的正则表达式将是改变第一步

a1 <- gsub("(?<=[A-Z])(?=\\[)|(?<=[A-Z])$", "1", a, perl = TRUE)
v1 <- str_extract_all(a1, '[A-Z]+')[[1]]
v2 <- str_extract_all(a1, "[0-9]+")[[1]]
res1 <- paste(strrep(v1, as.numeric(v2)), collapse="")
identical(res1, b)
#[1] TRUE

数据

a <- '[AGAT]5GAT[AGAT]7[AGAC]6AGAT'
b <- 'AGATAGATAGATAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGACAGACAGACAGACAGACAGACAGAT'

答案 1 :(得分:2)

试试这个:

a<-"[AGAT]5GAT[AGAT]7[AGAC]6AGAT"

   list<-unlist(strsplit(unlist(strsplit(a,"\\]")),"\\["))

   number<-suppressWarnings(as.numeric(gsub("([0-9]+).*$", "\\1", list)))
   number[is.na(number)]<-1  
   seq<-gsub('[0-9]+', '', list)

   out<-paste(rep(seq[2:(length(seq))],number[c(3:length(number),2)]),collapse = '')

 b="AGATAGATAGATAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGACAGACAGACAGACAGACAGACAGAT"

out==b
[1] TRUE

输出是正确的,但我不知道是否是输入中每种数据的通用解决方案