开发核苷酸序列
Develop nucleotide sequence
我想开发以下形式的表达式:
a <- "[AGAT]5GAT[AGAT]7[AGAC]6AGAT"
我想像这样转换表达式:
b <- "AGATAGATAGATAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGACAGACAGACAGACAGACAGACAGAT"
可以看到,钩子后面的数字表示该模式被找到的次数。
目前,我将 sub(".*[*(.*?) *].*", "\1", seq)
用于 []
之间的 select 字符,将 replicate(i, "my_string")
用于 []
之间的复制序列,但我找不到如何让它与我的数据一起工作。
我希望说得清楚。
我们用gsub
在[
之前没有数字的地方创建1('a1'),然后分别提取字母和数字('v1','v2'),使用 strrep
和 paste
将子字符串复制到单个字符串 ('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'
试试这个:
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
输出是正确的,但我不知道是否是输入中每种数据的通用解决方案
我想开发以下形式的表达式:
a <- "[AGAT]5GAT[AGAT]7[AGAC]6AGAT"
我想像这样转换表达式:
b <- "AGATAGATAGATAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGACAGACAGACAGACAGACAGACAGAT"
可以看到,钩子后面的数字表示该模式被找到的次数。
目前,我将 sub(".*[*(.*?) *].*", "\1", seq)
用于 []
之间的 select 字符,将 replicate(i, "my_string")
用于 []
之间的复制序列,但我找不到如何让它与我的数据一起工作。
我希望说得清楚。
我们用gsub
在[
之前没有数字的地方创建1('a1'),然后分别提取字母和数字('v1','v2'),使用 strrep
和 paste
将子字符串复制到单个字符串 ('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'
试试这个:
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
输出是正确的,但我不知道是否是输入中每种数据的通用解决方案