【问题标题】:Extract specific word matching the pattern提取与模式匹配的特定单词
【发布时间】:2018-12-10 11:18:44
【问题描述】:

我有一个带有列的数据框:

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

【问题讨论】:

  • 为什么要用[...] 包装字符序列?删除它们。 "MQRankSum=[^;]+"
  • 谢谢。它奏效了。
  • 这是来自 vcf 文件吗?你是如何将文件读入 R 的?也许使用 vcfR 包?
  • 这是一个带注释的 vcf 文件。我更喜欢过滤 .txt 文件。我知道 vcfR。

标签: r regex bioinformatics stringr vcf-variant-call-format


【解决方案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 信息 standard:

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

【讨论】:

  • 信息量很大。在上面的示例中,我提到了 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"
  • @beginner 上面的代码应该适用于任意数量的值。如果不是,请编辑您的帖子并提供可重现的示例:dput(head(nf1$Info))
【解决方案2】:

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

您要做的是匹配一个单词MQRankSum=,然后匹配;以外的任何字符:

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

如果您想从匹配中排除 MQRankSum=,请使用后向:

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

(?&lt;=MQRankSum=) 正向后视将确保在当前位置的左侧紧邻有 MQRankSum= 文本,并且只有在此之后才会匹配除 ; 之外的 1 个或多个字符。

【讨论】:

  • 非常有用的解释。
猜你喜欢
  • 1970-01-01
  • 2018-05-12
  • 2017-04-28
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 2021-12-02
相关资源
最近更新 更多