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 は Gene Name ですので、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
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 に答える
3

1つの方法は次のとおりです。

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

もっとエレガントな方法があると確信しています。

于 2012-03-15T13:59:21.927 に答える
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 に答える