提取与模式匹配的特定单词

时间:2018-07-02 09:11:14

标签: r regex bioinformatics stringr

我的数据框带有一列:

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 :(得分:4)

在方括号中包含字符会创建一个与任何已定义字符匹配的字符类,因此[yes]+会与yyyyyyyyyeyyyyss等匹配。

您要做的是先匹配单词MQRankSum=,然后匹配;以外的其他字符:

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

如果您想从比赛中淘汰MQRankSum=,请使用后退标记:

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

后面的(?<=MQRankSum=)正向查找将确保当前位置的左侧紧跟着MQRankSum=文本,并且只有在此之后,才能匹配;以外的1个或多个字符。< / p>

答案 1 :(得分:1)

我们可以将 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 INFO standard

  

各种站点级别的注释。 INFO中包含的注释   字段表示为标签-值对,其中标签和值分别为   用等号(=)分隔,而对用冒号分隔,   即;如本例所示:
  MQ=99.00;MQ0=0;QD=17.94