2012-03-15 40 views
19

Tôi có câu hỏi về việc trích xuất một phần của chuỗi. Ví dụ tôi có một chuỗi như thế này:R trích xuất một phần của chuỗi

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" 

tôi cần phải giải nén tất cả mọi thứ giữa GN=; Vì vậy, ở đây nó sẽ được NOC2L.

Điều đó có khả thi không?

Lưu ý: Đây là INFO biểu mẫu cột VCF file format. GN là tên Gene, vì vậy chúng tôi muốn trích xuất tên gen từ cột INFO.

+0

Câu hỏi không rõ ràng vì có vẻ như chuỗi mong muốn của bạn sẽ không luôn được theo sau bởi dấu chấm phẩy. – jbaums

Trả lời

33

thử điều này:

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

Cảm ơn Kohske. Và nếu NOC2L ở cuối dòng thì sao? sau đó các đường lỗ được chọn! – Lisann

+0

Chuỗi của bạn chính xác như thế nào? Bạn có thể vui lòng cung cấp một ví dụ? – kohske

+0

như sau: a <- "DP = 26; AN = 2; DB = 1; AC = 1; MQ = 56; MZ = 0; ST = 5: 10,7: 2; CQ = SYNONYMOUS_CODING; GN = NOC2L – Lisann

3

Một cách sẽ là:

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

tôi chắc chắn có nhiều cách thanh lịch hơn để làm điều đó.

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

Giả sử phẩy tách yếu tố của bạn, và dấu bằng xảy ra độc quyền giữa cặp khóa/giá trị, một phương pháp không nghiêm-regex sẽ là:

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" 

Sau đó, nó chỉ là vấn đề lựa chọn thích hợp thành phần.

1

Như chuỗi đến từ tập tin VCF, chúng ta có thể sử dụng VariantAnnotation gói:

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 

Trong đối tượng dụ VCF trên không có "GN" cột, nhưng ý tưởng là như nhau, vì vậy trong trường hợp của bạn , bên dưới sẽ hoạt động:

# extract gene name 
info(vcf)[, "GN"] 
Các vấn đề liên quan