2012-03-15 7 views
19

का हिस्सा निकालें मेरे पास स्ट्रिंग का एक हिस्सा निकालने के बारे में कोई प्रश्न है।आर स्ट्रिंग

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" 

मैं इसे NOC2L हो जाएगा GN= और ; के बीच यहाँ सब कुछ निकालने के लिए तो जरूरत है: उदाहरण के लिए मैं इस तरह एक स्ट्रिंग है।

क्या यह संभव है?

नोट: यह INFO कॉलम फॉर्म VCF file format है। जीएन जीन नाम है, इसलिए हम INFO कॉलम से जीन नाम निकालना चाहते हैं।

+0

प्रश्न थोड़ा अस्पष्ट है, क्योंकि ऐसा लगता है कि आपकी वांछित स्ट्रिंग हमेशा अर्धविराम द्वारा नहीं की जाएगी। – jbaums

उत्तर

33

इस प्रयास करें:

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

कोहस्के धन्यवाद। और क्या होगा यदि एनओसी 2 एल लाइन के अंत में है? तो छेद रेखा का चयन किया जाता है! – Lisann

+0

आपकी स्ट्रिंग बिल्कुल कैसी है? क्या आप एक उदाहरण प्रदान कर सकते हैं? – kohske

+0

इस तरह: एक <- "डीपी = 26; एएन = 2; डीबी = 1; एसी = 1; एमक्यू = 56; एमजेड = 0; एसटी = 5: 10,7: 2; सीक्यू = SYNONYMOUS_CODING; जीएन = एनओसी 2 एल – Lisann

3

एक तरीका यह होगा:

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

मुझे यकीन है कि वहाँ यह करने के लिए और अधिक सुरुचिपूर्ण तरीके हैं रहा हूँ।

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) 
14

मान लिया जाये कि अर्धविराम अपने तत्वों को अलग, और बराबर होती संकेत कुंजी/मान जोड़े के बीच विशेष रूप से पाए जाते हैं, एक गैर सख्ती से-regex तरीका होगा:

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

स्ट्रिंग के रूप में वीसीएफ फ़ाइल से आ रही है, हम 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 

ऊपर के उदाहरण वीसीएफ वस्तु में कोई "GN" कॉलम नहीं है, लेकिन यह विचार एक ही है, आपके मामले में तो , नीचे काम करना चाहिए:

# extract gene name 
info(vcf)[, "GN"]