文字列の一部の抽出について質問があります。たとえば、次のような文字列があります。
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
列から遺伝子名を抽出します。
これを試して:
sub(".*?GN=(.*?);.*", "\\1", a)
# [1] "NOC2L"
セミコロンで要素を分離し、等号がキーと値のペア間でのみ発生するとすると、厳密に正規表現ではないメソッドは次のようになります。
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"
次に、適切な要素を選択するだけです。
1つの方法は次のとおりです。
gsub(".+=(\\w+);.+", "\\1", a, Perl=T)
もっとエレガントな方法があるはずです。
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)
文字列は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"]
逆参照を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=
は試合の前でなければならない(?=;|$)
アサート;
または文字列の終わり($
)は、一致の後ろ(後)でなければなりません[^;]*
は、;
以外の任意の数の文字に一致します注:[^;]*
は.*
よりも使用されました。後者は;
に一致し、文字列の最後($
)まで一致し続ける可能性があるためです。