提取与模式匹配的特定单词
Extract specific word matching the pattern
我有一个包含一列的数据框:
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]+")
returns BaseQRankSum 的值而不是 MQRankSum.
将字符包含在方括号中会创建一个匹配任何已定义字符的字符 class,因此 [yes]+
匹配 yyyyyyyyy
、eyyyyss
等
你想要做的是匹配一个词 MQRankSum
, =
, 然后是除 ;
:
之外的任何字符
str_extract(nf1$Info,"MQRankSum=[^;]+")
如果您想从匹配中排除 MQRankSum=
,请使用回顾:
str_extract(nf1$Info,"(?<=MQRankSum=)[^;]+")
^^^^^^^^^^^^^^^
(?<=MQRankSum=)
正后视将确保紧邻当前位置左侧的 MQRankSum=
文本,并且只有在那之后才会匹配 ;
以外的 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:
Various site-level annotations. The annotations contained in the INFO
field are represented as tag-value pairs, where the tag and value are
separated by an equal sign, ie =, and pairs are separated by colons,
ie ; as in this example:
MQ=99.00;MQ0=0;QD=17.94
.
我有一个包含一列的数据框:
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]+")
returns BaseQRankSum 的值而不是 MQRankSum.
将字符包含在方括号中会创建一个匹配任何已定义字符的字符 class,因此 [yes]+
匹配 yyyyyyyyy
、eyyyyss
等
你想要做的是匹配一个词 MQRankSum
, =
, 然后是除 ;
:
str_extract(nf1$Info,"MQRankSum=[^;]+")
如果您想从匹配中排除 MQRankSum=
,请使用回顾:
str_extract(nf1$Info,"(?<=MQRankSum=)[^;]+")
^^^^^^^^^^^^^^^
(?<=MQRankSum=)
正后视将确保紧邻当前位置左侧的 MQRankSum=
文本,并且只有在那之后才会匹配 ;
以外的 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:
Various site-level annotations. The annotations contained in the INFO field are represented as tag-value pairs, where the tag and value are separated by an equal sign, ie =, and pairs are separated by colons, ie ; as in this example:
MQ=99.00;MQ0=0;QD=17.94
.