Извлечь конкретное слово, соответствующее шаблону - PullRequest
0 голосов
/ 02 июля 2018

У меня есть фрейм данных с колонкой:

nf1$Info = AC=1;AF=0.500;AN=2;BaseQRankSum=-1.026e+00;ClippingRankSum=-1.026e+00;DP=4;ExcessHet=3.0103;FS=0.000;MLEAC=1;MLEAF=0.500;MQ=28.25;MQRankSum=-1.026e+00;QD=10.18;ReadPosRankSum=1.03;SOR=0.693

Я пытаюсь извлечь определенное значение из этого столбца.

Например, Я заинтересован в "MQRankSum", и я использовал:

str_extract(nf1$Info,"[MQRankSum]+=[:punct:]+[0-9]+[.]+[0-9]+")

Возвращает значение для BaseQRankSum вместо MQRankSum .

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Мы можем разбить столбец INFO на несколько столбцов, а затем извлечь нужный столбец:

# dummy data
df1 <- data.frame(x = 1:3,
                  info = c("AC=1;AF=0.500;MQRankSum=2;BaseQRankSum=-1.026e+00;ClippingRankSum=-1.026e+00;",
                           "AC=1;AF=0.500;MQRankSum=2;ClippingRankSum=-1.026e+00;DP=4;",
                           "AN=2;BaseQRankSum=-1.026e+00;"),
                  stringsAsFactors = FALSE)

# split INFO into seperate columns
df1_info <- data.table::rbindlist(
  lapply(strsplit(df1$info, ";|="), function(i)
    setNames(data.frame(t(as.numeric(i[ c(FALSE, TRUE) ]))), i[ c(TRUE, FALSE) ])
    ),
  fill = TRUE)

df1_info
#    AC  AF MQRankSum BaseQRankSum ClippingRankSum DP AN
# 1:  1 0.5         2       -1.026          -1.026 NA NA
# 2:  1 0.5         2           NA          -1.026  4 NA
# 3: NA  NA        NA       -1.026              NA NA  2

# extract required column 
df1_info$BaseQRankSum
# [1] -1.026     NA -1.026

VCF ИНФО стандарт :

Различные аннотации на уровне сайта. Аннотации, содержащиеся в ИНФО поля представлены в виде пар тег-значение, где тег и значение разделены знаком равенства, т.е. =, а пары разделены двоеточиями, т.е. как в этом примере:
MQ=99.00;MQ0=0;QD=17.94.

0 голосов
/ 02 июля 2018

Включение символов в квадратные скобки создает класс символов, соответствующий любому из определенных символов, поэтому [yes]+ соответствует yyyyyyyyy, eyyyyss и т. Д.

То, что вы хотите сделать, это сопоставить слово MQRankSum, =, а затем любые символы, кроме ;:

str_extract(nf1$Info,"MQRankSum=[^;]+")

Если вы хотите исключить MQRankSum= из матча, используйте вид сзади:

str_extract(nf1$Info,"(?<=MQRankSum=)[^;]+")
                      ^^^^^^^^^^^^^^^

Положительный знак (?<=MQRankSum=) обеспечит наличие текста MQRankSum= непосредственно слева от текущего местоположения, и только после этого будет соответствовать 1 или более символов, отличных от ;.

...