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

时间:2019-06-04 22:52:25

标签: r string dataframe

我有一个蛋白质蛋白质组数据框,其中有几列。其中之一就是“描述”,其中包含蛋白质,操作系统,基因名称(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

谢谢大家,

4 个答案:

答案 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 ) )