R提取部分字符串

时间:2012-03-15 13:48:47

标签: r regex string extract bioinformatics

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

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列中提取基因名称。

6 个答案:

答案 0 :(得分:33)

试试这个:

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

答案 1 :(得分:14)

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

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"  

然后只需选择合适的元素。

答案 2 :(得分:3)

一种方法是:

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

我相信有更优雅的方法可以做到。

答案 3 :(得分:3)

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)

答案 4 :(得分:1)

由于字符串来自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"]

答案 5 :(得分:0)

作为将引用与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

其中:

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

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