【问题标题】:How to find substring from string in R?如何从R中的字符串中找到子字符串?
【发布时间】:2018-11-24 05:40:30
【问题描述】:

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

x<-"TATAATGCAACGAGGGGCATAATTATATATGCCCAAAATCTGATATAATGACCGGGTAG"

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

我的代码是

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

帮助我解决我的问题。

【问题讨论】:

  • from ATG to TAA ... 到 which TAA?在ATG 之后可能有许多TAA 碱基。
  • TAA 出现在 ATG 之后,是的,一个序列中可能有很多 TAA,我想将它们全部提取出来。但不仅是 TAA,还有 TAG 和 TGA
  • 这可能会起作用:regmatches(x, gregexpr("(?&lt;=ATG).*?(?=TAA)", x, perl = TRUE))。你想用 TGA 和 TAG 做什么?

标签: r regex stringi


【解决方案1】:

我相信您的意思是来自stringr 包的str_extract_all。该函数没有名为regex 的参数;你需要pattern。一旦你做到了,你可以使用 or | 来允许任何序列结尾。

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

【讨论】:

    【解决方案2】:

    这是使用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
    

    【讨论】:

    • 但我只是不希望它只停留在 TAA,我的问题是我如何让它从 ATG 开始并停止在序列中找到 TAA、TGA 或 TAG 并提取它并重复它以检查序列中的更多子字符串
    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 2016-09-14
    • 1970-01-01
    • 2017-10-02
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多