R извлечь часть строки - PullRequest
       13

R извлечь часть строки

19 голосов
/ 15 марта 2012

У меня вопрос по извлечению части строки. Например, у меня есть такая строка:

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.

Ответы [ 6 ]

33 голосов
/ 15 марта 2012

Попробуйте это:

sub(".*?GN=(.*?);.*", "\\1", a)
# [1] "NOC2L"
14 голосов
/ 15 марта 2012

Если точки с запятой разделяют ваши элементы, а знаки равенства встречаются исключительно между парами ключ / значение, метод не-строго-регулярного выражения будет выглядеть так:

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"  

Тогда нужно просто выбрать соответствующий элемент.

3 голосов
/ 15 марта 2012
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)
3 голосов
/ 15 марта 2012

Один путь будет:

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

Я уверен, что есть более изящные способы сделать это.

1 голос
/ 13 декабря 2016

Поскольку строка поступает из файла 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"]
0 голосов
/ 25 апреля 2018

В качестве альтернативы комбинированию обратных ссылок с 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= должно быть впереди матча
  • (?=;|$) утверждает ; или конец строки ($) должен быть позади (после) совпадения
  • [^;]* соответствует любому количеству символов, которые не ;

Примечание: [^;]* использовалось вместо .*, так как последний мог соответствовать ; и продолжать сопоставление до конца строки ($).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...