如何在R中的数据框中提取字符串的中间部分?

Gui*_*eis 3 string r dataframe

我有一个包含几列的蛋白质组数据框。其中之一是称为描述,其中我们有蛋白质名称、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"
Run Code Online (Sandbox Code Playgroud)

然后,我只想提取该蛋白质的基因名称

我尝试使用 :str_extract 工具,但是,它不起作用。也许是因为我没有使用工具所需的正确模式

str_extract(A$Description, start = "GN=", end = " PE")
Run Code Online (Sandbox Code Playgroud)

我想要一个包含这些基因名称的数据框

> head(pccmit$Description)
[1] NDRG4
[2] ATP6V1B2
[3] TF
Run Code Online (Sandbox Code Playgroud)

谢谢大家

sum*_*ftw 5

使用stringr包:

library(stringr)
str_extract(pccmit$Description, "(?<=GN=).*(?= PE)")
Run Code Online (Sandbox Code Playgroud)

(?<=GN=)向后看GN=(?= PE)向前看= PE.*匹配中间的所有内容。


G. *_*eck 5

这里有一些替代方案。除了 (5) 之外,没有使用任何包。

1) sub使用Lines在最后的注释中显示并假设基因名称不包含任何空格,这将匹配 GN= 之前的所有内容,然后捕获后续的非空格,然后匹配所有内容,并用捕获的部分替换所有内容,即GN= 之后的非空格。不使用任何包。

sub(".*GN=(\\S+).*", "\\1", Lines)
## [1] "NDRG4"    "ATP6V1B2" "TF"       "GLS"      "AK1"      "SFXN1"   
Run Code Online (Sandbox Code Playgroud)

2)另一种方法是删除包括 GN= 在内的所有内容,然后从后续空格开始删除所有内容:

gsub(".*GN=|\\s.*", "", Lines)
## [1] "NDRG4"    "ATP6V1B2" "TF"       "GLS"      "AK1"      "SFXN1"   
Run Code Online (Sandbox Code Playgroud)

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"   
Run Code Online (Sandbox Code Playgroud)

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)))
Run Code Online (Sandbox Code Playgroud)

给出这个 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
Run Code Online (Sandbox Code Playgroud)

如果DF是该数据框,则 DF$GN 是基因名称。

5) Strapplyc 指定由 GN= 后跟非空白组成的模式,并将后者放入返回的捕获组中。这是这里任何替代方案中最简单的正则表达式。

library(gsubfn)
strapplyc(Lines, "GN=(\\S+)", simplify = TRUE)
## [1] "NDRG4"    "ATP6V1B2" "TF"       "GLS"      "AK1"      "SFXN1"   
Run Code Online (Sandbox Code Playgroud)

笔记

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")
Run Code Online (Sandbox Code Playgroud)