【问题标题】:R extract part of stringR提取字符串的一部分
【发布时间】:2012-04-01 00:56:13
【问题描述】:

我有一个关于提取字符串的一部分的问题。例如我有一个这样的字符串:

a <- "DP=26;AN=2;DB=1;AC=1;MQ=56;MZ=0;ST=5:10,7:2;CQ=SYNONYMOUS_CODING;GN=NOC2L;PA=1^1:0.720&2^1:0"

我需要提取GN=; 之间的所有内容。所以这里将是NOC2L

这可能吗?

注意:这是INFO 列形式VCF file format。 GN是基因名称,所以我们要从INFO列中提取基因名称。

【问题讨论】:

  • 问题有点不清楚,因为您想要的字符串似乎并不总是后跟分号。

标签: r regex string bioinformatics vcf-variant-call-format


【解决方案1】:

试试这个:

sub(".*?GN=(.*?);.*", "\\1", a)
# [1] "NOC2L"

【讨论】:

  • 谢谢科斯克。如果 NOC2L 在行尾呢?然后选择孔线!
  • 你的字符串到底怎么样?可以举个例子吗?
  • 像这样:a
  • 试试这个:sub(".*?GN=(.*?)(;.*|$)", "\\1", a)
  • 感谢您的提问/回答。如果“a”中没有这样的东西怎么办。在这种情况下,我希望它返回 NA。它不是这种形状。有什么想法吗?
【解决方案2】:

假设分号分隔您的元素,并且等号仅出现在键/值对之间,则非严格正则表达式方法将是:

bits <- unlist(strsplit(a, ';'))
do.call(rbind, strsplit(bits, '='))

      [,1] [,2]               
 [1,] "DP" "26"               
 [2,] "AN" "2"                
 [3,] "DB" "1"                
 [4,] "AC" "1"                
 [5,] "MQ" "56"               
 [6,] "MZ" "0"                
 [7,] "ST" "5:10,7:2"         
 [8,] "CQ" "SYNONYMOUS_CODING"
 [9,] "GN" "NOC2L"            
[10,] "PA" "1^1:0.720&2^1:0"  

那么只需选择合适的元素即可。

【讨论】:

    【解决方案3】:

    一种方法是:

    gsub(".+=(\\w+);.+", "\\1", a, perl=T)
    

    我相信还有更优雅的方法可以做到这一点。

    【讨论】:

      【解决方案4】:
      a <- "DP=26;AN=2;DB=1;AC=1;MQ=56;MZ=0;ST=5:10,7:2;CQ=SYNONYMOUS_CODING;GN=NOC2L;PA=1^1:0.720&2^1:0"
      m = regexpr("GN.*;",a)
      substr(a,m+3,m+attr(m,"match.length")-2)
      

      【讨论】:

        【解决方案5】:

        由于字符串来自 VCF 文件,我们可以使用 VariantAnnotation 包:

        library(VariantAnnotation)
        
        # read dummy VCF file
        fl <- system.file("extdata", "chr22.vcf.gz", package="VariantAnnotation")
        vcf <- readVcf(fl, "hg19")
        
        # see first 5 variables for info column
        info(vcf)[1:3, 1:5]
        # DataFrame with 3 rows and 5 columns
        #                  LDAF   AVGPOST       RSQ     ERATE     THETA
        #             <numeric> <numeric> <numeric> <numeric> <numeric>
        # rs7410291      0.3431    0.9890    0.9856     2e-03    0.0005
        # rs147922003    0.0091    0.9963    0.8398     5e-04    0.0011
        # rs114143073    0.0098    0.9891    0.5919     7e-04    0.0008
        
        # Now extract one column, e.g.: LDAF
        info(vcf)[1:3, "LDAF"]
        # [1] 0.3431 0.0091 0.0098
        

        在上面的示例 VCF 对象中没有“GN”列,但想法是一样的,所以在你的情况下,下面应该可以工作:

        # extract gene name
        info(vcf)[, "GN"]
        

        【讨论】:

          【解决方案6】:

          作为将反向引用与sub 组合的替代方法,您可以使用带有提取操作的lookbehind 和lookahead 断言,如下所示:

          library(stringr)
          a <- "DP=26;AN=2;DB=1;AC=1;MQ=56;MZ=0;ST=5:10,7:2;CQ=SYNONYMOUS_CODING;GN=NOC2L;PA=1^1:0.720&2^1:0"
          str_extract(a, "(?<=GN=)[^;]*(?=;|$)")
          # [1] NOC2L
          

          地点:

          • (?&lt;=GN=) 断言 GN= 必须领先于比赛
          • (?=;|$) 断言 ; 或字符串结尾 ($) 必须在匹配之后(之后)
          • [^;]* 匹配任意数量的不是; 的字符

          注意:[^;]* 用于 .*,因为后者可以匹配 ; 并继续匹配直到字符串结尾 ($)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-19
            • 1970-01-01
            • 2020-12-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多