这里有一些替代方案。除了 (5) 之外,没有使用任何包。
1) sub 使用末尾注释中显示的Lines 并假设基因名称不包含任何空格,这将匹配 GN= 之前的所有内容,然后捕获后续的非空格然后将所有内容替换为捕获的部分,即 GN= 之后的非空格。没有使用任何包。
sub(".*GN=(\\S+).*", "\\1", Lines)
## [1] "NDRG4" "ATP6V1B2" "TF" "GLS" "AK1" "SFXN1"
2) 另一种方法是删除 GN= 之前的所有内容(包括 GN=),然后删除后续空格之后的所有内容:
gsub(".*GN=|\\s.*", "", Lines)
## [1] "NDRG4" "ATP6V1B2" "TF" "GLS" "AK1" "SFXN1"
3) read.dcf 另一种方法是将数据转换为 DCF 格式,然后使用read.dcf 将其读入。这将解析所有字段并从生成矩阵m 的数据本身导出它们的名称。
g <- paste0("\nX:", gsub("(\\S+)=", "\n\\1:", Lines))
m <- read.dcf(textConnection(g))
m
## X OS GN PE SV
## [1,] "Protein NDRG4" "Homo sapiens" "NDRG4" "1" "2"
## [2,] "V-type proton ATPase subunit B_ brain isoform" "Homo sapiens" "ATP6V1B2" "1" "3"
## [3,] "Serotransferrin" "Homo sapiens" "TF" "1" "3"
## [4,] "Glutaminase kidney isoform_ mitochondrial" "Homo sapiens" "GLS" "1" "1"
## [5,] "Adenylate kinase isoenzyme 1" "Homo sapiens" "AK1" "1" "3"
## [6,] "Sideroflexin-1" "Homo sapiens" "SFXN1" "1" "4"
m[, "GN"]
## [1] "NDRG4" "ATP6V1B2" "TF" "GLS" "AK1" "SFXN1"
4) strcapture 解析所有字段的另一种方法是使用strcapture。这将返回一个数据框,而 read.dcf 返回一个矩阵。此解决方案要求我们指定字段,而 (3) 派生它们。
strcapture("(.*) OS=(.*) GN=(.*) PE=(.*) SV=(.*)", Lines,
list(X = character(0), OS = character(0), GN = character(0),
PE = numeric(0), SV = numeric(0)))
给出这个data.frame:
X OS GN PE SV
1 Protein NDRG4 Homo sapiens NDRG4 1 2
2 V-type proton ATPase subunit B_ brain isoform Homo sapiens ATP6V1B2 1 3
3 Serotransferrin Homo sapiens TF 1 3
4 Glutaminase kidney isoform_ mitochondrial Homo sapiens GLS 1 1
5 Adenylate kinase isoenzyme 1 Homo sapiens AK1 1 3
6 Sideroflexin-1 Homo sapiens SFXN1 1 4
如果 DF 是那个数据框,那么 DF$GN 是基因名称。
5) strapplyc 指定一个由 GN= 后跟非空格组成的模式,并将后者放入返回的捕获组中。这个是这里所有替代方法中最简单的正则表达式。
library(gsubfn)
strapplyc(Lines, "GN=(\\S+)", simplify = TRUE)
## [1] "NDRG4" "ATP6V1B2" "TF" "GLS" "AK1" "SFXN1"
注意
Lines <- c("Protein NDRG4 OS=Homo sapiens GN=NDRG4 PE=1 SV=2",
"V-type proton ATPase subunit B_ brain isoform OS=Homo sapiens GN=ATP6V1B2 PE=1 SV=3",
"Serotransferrin OS=Homo sapiens GN=TF PE=1 SV=3",
"Glutaminase kidney isoform_ mitochondrial OS=Homo sapiens GN=GLS PE=1 SV=1",
"Adenylate kinase isoenzyme 1 OS=Homo sapiens GN=AK1 PE=1 SV=3",
"Sideroflexin-1 OS=Homo sapiens GN=SFXN1 PE=1 SV=4")