我想开发以下形式的表达式:
a <- "[AGAT]5GAT[AGAT]7[AGAC]6AGAT"
我想像这样转换表达式:
b <- "AGATAGATAGATAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGACAGACAGACAGACAGACAGACAGAT"
可以看到,钩子(Hook)后面的数字表示该模式被找到的次数。
目前我使用 sub(".*[*(.*?) *].*", "\\1", seq)
在 [] 之间选择字符
和 replicate(i, "my_string")
用于在 []
之间复制序列,但我找不到如何让它与我的数据一起使用。
我希望说的很清楚。
最佳答案
我们使用gsub
在[
('a1')之前没有数字的地方创建1,然后分别提取字母和数字('v1', ' v2'), 使用 strrep
进行复制并将子字符串粘贴
到单个字符串 ('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
-输出
#[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'
关于r - 开发核苷酸序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48882125/