我有一个蛋白质蛋白质组数据框,其中有几列。其中之一就是“描述”,其中包含蛋白质,操作系统,基因名称(GN),PE和SV的名称,如下所示。
> head(pccmit$Description)
[1] "Protein NDRG4 OS=Homo sapiens GN=NDRG4 PE=1 SV=2"
[2] "V-type proton ATPase subunit B_ brain isoform OS=Homo sapiens GN=ATP6V1B2 PE=1 SV=3"
[3] "Serotransferrin OS=Homo sapiens GN=TF PE=1 SV=3"
[4] "Glutaminase kidney isoform_ mitochondrial OS=Homo sapiens GN=GLS PE=1 SV=1"
[5] "Adenylate kinase isoenzyme 1 OS=Homo sapiens GN=AK1 PE=1 SV=3"
[6] "Sideroflexin-1 OS=Homo sapiens GN=SFXN1 PE=1 SV=4"
然后,我只想提取这些蛋白质的基因名称
我尝试使用:str_extract工具,但是它不起作用。也许是因为我没有使用该工具所需的正确模式
str_extract(A$Description, start = "GN=", end = " PE")
我想要一个带有这些基因名称的数据框
> head(pccmit$Description)
[1] NDRG4
[2] ATP6V1B2
[3] TF
谢谢大家,
答案 0 :(得分:4)
使用stringr
软件包:
library(stringr)
str_extract(pccmit$Description, "(?<=GN=).*(?= PE)")
(?<=GN=)
在GN=
之后落后,(?= PE)
在= PE
之前领先,.*
匹配中间的所有事物。
答案 1 :(得分:4)
这里有一些替代方法。除(5)外,不使用任何软件包。
1)子使用注释末尾的Lines
,并假设基因名称不包含任何空格,这将匹配GN =之前的所有内容,然后捕获后续的非-whitespace,然后匹配所有内容,将所有内容替换为捕获的部分,即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
。这将返回一个数据帧,而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)stripplyc 指定一个由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")
答案 2 :(得分:0)
这是另一种方法(以R为底),与这里的其他答案相比当然不好,但是如果您对正则表达式不好,可以(我想)-
x <- "Protein NDRG4 OS=Homo sapiens GN=NDRG4 PE=1 SV=2"
strsplit(x, " ") %>%
unlist() %>%
grep(pattern = "GN=", ., value = T) %>%
sub("GN=", "", .)
[1] "NDRG4"
答案 3 :(得分:0)
另一种基本方法可能是:
regmatches( Lines, gregexpr( "(?<=GN=).*?(?= PE)", Lines, perl = TRUE ) )