我有一个有几列的蛋白质组数据框架。其中一个叫做描述,我们有蛋白质,OS,基因名(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
谢谢大家,伙计们
发布于 2019-06-04 23:07:16
使用stringr
包:
library(stringr)
str_extract(pccmit$Description, "(?<=GN=).*(?= PE)")
(?<=GN=)
落后于GN=
和(?= PE)
,而(?= PE)
则领先于= PE
,.*
与所有的东西都匹配在中间。
发布于 2019-06-04 23:08:23
以下是一些替代方案。除(5)外,不使用任何包。
1)使用注释结尾所示的Lines
子,假设基因名称不包括任何空格,这将匹配到GN=的所有内容,然后捕获后续的非空格,然后将所有内容替换为捕获的部分,即GN=后面的非空格。不使用包装。
sub(".*GN=(\\S+).*", "\\1", Lines)
## [1] "NDRG4" "ATP6V1B2" "TF" "GLS" "AK1" "SFXN1"
2)另一种方法是删除直到并包含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")
发布于 2019-06-05 00:16:42
这是另一种方法(基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"
https://stackoverflow.com/questions/56452306
复制相似问题