我的数据框带有一列:
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 。
答案 0 :(得分:4)
在方括号中包含字符会创建一个与任何已定义字符匹配的字符类,因此[yes]+
会与yyyyyyyyy
,eyyyyss
等匹配。
您要做的是先匹配单词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
。