20

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

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 文件格式。GN 是基因名称,所以我们要从INFO列中提取基因名称。

4

6 回答 6

34

试试这个:

sub(".*?GN=(.*?);.*", "\\1", a)
# [1] "NOC2L"
于 2012-03-15T13:53:42.173 回答
15

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

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"  

然后只需选择适当的元素即可。

于 2012-03-15T14:09:50.923 回答
3

一种方法是:

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

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

于 2012-03-15T13:59:21.927 回答
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)
于 2012-03-15T14:00:12.947 回答
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"]
于 2016-12-13T08:51:02.200 回答
0

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

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=必须在匹配之前
  • (?=;|$)断言;或字符串结尾 ( $) 必须在匹配之后(之后)
  • [^;]*匹配任意数量的非;

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

于 2018-04-25T12:38:52.043 回答