如何在R中找到字符串中的子字符串?

时间:2018-06-14 12:28:07

标签: r regex stringi

如果我的字符串是DNA序列,

x<-"TATAATGCAACGAGGGGCATAATTATATATGCCCAAAATCTGATATAATGACCGGGTAG"

我想从ATG提取子串到TAA,TGA或TAG。我可以通过使用带有正则表达式的stringi包从一个点提取到另一个点。

我的代码是

stri_extract_all(x, regex = "ATG.*?TAA")

通过解决我的问题来帮助我。

2 个答案:

答案 0 :(得分:1)

我相信你的意思是来自str_extract_all套餐的stringr。该函数没有名为regex的参数;你需要pattern。一旦你完成了,你可以使用或|允许任何序列结束。

library(stringr)
str_extract_all(x, pattern="ATG.*?(TAA|TGA|TAG)")
[[1]]
[1] "ATGCAACGAGGGGCATAA" "ATGCCCAAAATCTGA"    "ATGACCGGGTAG"

答案 1 :(得分:0)

使用Biostrings

是可能的
library("Biostrings")

x <- "TATAATGCAACGAGGGGCATAATTATATATGCCCAAAATCTGATATAATGACCGGGTAG"

# Get all combinations of substrings starting with "ATG" and ending with "TAA"
library(tidyverse)
df <- expand.grid(start(matchPattern("ATG", x)), end(matchPattern("TAA", x))) %>%
    filter(Var1 < Var2);
ir <- IRanges(df[, 1], df[, 2]);

extractAt(BString(x), IRanges(df[, 1], df[, 2]));
#A BStringSet instance of length 3
#  width seq
#[1]    18 ATGCAACGAGGGGCATAA
#[2]    44 ATGCAACGAGGGGCATAATTATATATGCCCAAAATCTGATATAA
#[3]    20 ATGCCCAAAATCTGATATAA

由于您正在使用DNA序列数据,我建议您熟悉Bioconductor中的Biostrings。除了Biostrings之外,还存在许多Bioconductor软件包,当您使用DNA / RNA序列数据时,这些软件包将使您的生活更加轻松(沿着轨道)。

更新

要考虑多个终止密码子,只需将end(matchPattern(...))包裹在sapply循环中。

df <- expand.grid(
    start(matchPattern("ATG", x)),
    unlist(sapply(c("TAA", "TGA", "TAG"), function(ss) end(matchPattern(ss, x))))) %>%
    filter(Var1 < Var2);
ir <- IRanges(df[, 1], df[, 2]);

extractAt(BString(x), IRanges(df[, 1], df[, 2]));
# [1]    18 ATGCAACGAGGGGCATAA
# [2]    44 ATGCAACGAGGGGCATAATTATATATGCCCAAAATCTGATATAA
# [3]    20 ATGCCCAAAATCTGATATAA
# [4]    39 ATGCAACGAGGGGCATAATTATATATGCCCAAAATCTGA
# [5]    15 ATGCCCAAAATCTGA
# ...   ... ...
# [7]    23 ATGCCCAAAATCTGATATAATGA
# [8]     4 ATGA
# [9]    55 ATGCAACGAGGGGCATAATTATATATGCCCAAAATCTGATATAATGACCGGGTAG
#[10]    31 ATGCCCAAAATCTGATATAATGACCGGGTAG
#[11]    12 ATGACCGGGTAG