我有一个关于提取字符串的一部分的问题。例如,我有一个这样的字符串:
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
列中提取基因名称。
答案 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=
必须领先于比赛(?=;|$)
断言;
或字符串结尾($
)必须在匹配之后(之后)[^;]*
匹配任何数量不是;
注意:[^;]*
用于.*
,因为后者可以匹配;
并继续匹配,直到字符串结尾($
)。