Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中提取数据帧中字符串的中间部分?_R_String_Dataframe - Fatal编程技术网

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

如何在R中提取数据帧中字符串的中间部分?,r,string,dataframe,R,String,Dataframe,我有一个蛋白质组数据框架,有几列。其中一个叫做描述,其中我们有蛋白质、OS、基因名GN、PE和SV,如下所示 >headpccmit$说明 [1] 蛋白质NDRG4 OS=智人GN=NDRG4 PE=1 SV=2 [2] V型质子ATP酶亚单位B脑亚型OS=智人GN=ATP6V1B2 PE=1 SV=3 [3] 血清转铁蛋白OS=智人GN=TF PE=1 SV=3 [4] 谷氨酰胺酶肾亚型\线粒体OS=智人GN=GLS PE=1 SV=1 [5] 腺苷酸激酶同工酶1 OS=智人GN=AK1 PE

我有一个蛋白质组数据框架,有几列。其中一个叫做描述,其中我们有蛋白质、OS、基因名GN、PE和SV,如下所示

>headpccmit$说明 [1] 蛋白质NDRG4 OS=智人GN=NDRG4 PE=1 SV=2 [2] V型质子ATP酶亚单位B脑亚型OS=智人GN=ATP6V1B2 PE=1 SV=3 [3] 血清转铁蛋白OS=智人GN=TF PE=1 SV=3 [4] 谷氨酰胺酶肾亚型\线粒体OS=智人GN=GLS PE=1 SV=1 [5] 腺苷酸激酶同工酶1 OS=智人GN=AK1 PE=1 SV=3 [6] Sideroflexin-1 OS=智人GN=SFXN1 PE=1 SV=4 然后,我想提取蛋白质的基因名

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

str_extractA$Description,start=GN=,end=PE 我希望有一个包含这些基因名称的数据框

> head(pccmit$Description)
[1] NDRG4
[2] ATP6V1B2
[3] TF
感谢大家使用stringr软件包:

?使用stringr软件包:


以下是一些备选方案。除5外,不使用任何包装

1 sub使用末尾注释中显示的行,并假设基因名称不包含任何空格,这将匹配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的数据本身派生出它们的名称

给出此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 Straplyc指定一个模式,该模式由GN=和非空白组成,并将后者放入一个捕获组中,该捕获组返回。这是这里所有备选方案中最简单的正则表达式

library(gsubfn)
strapplyc(Lines, "GN=(\\S+)", simplify = TRUE)
## [1] "NDRG4"    "ATP6V1B2" "TF"       "GLS"      "AK1"      "SFXN1"   
笔记
这里有一些替代方案。除5外,不使用任何包装

1 sub使用末尾注释中显示的行,并假设基因名称不包含任何空格,这将匹配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的数据本身派生出它们的名称

给出此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 Straplyc指定一个模式,该模式由GN=和非空白组成,并将后者放入一个捕获组中,该捕获组返回。这是这里所有备选方案中最简单的正则表达式

library(gsubfn)
strapplyc(Lines, "GN=(\\S+)", simplify = TRUE)
## [1] "NDRG4"    "ATP6V1B2" "TF"       "GLS"      "AK1"      "SFXN1"   
笔记
这是另一种方法,与其他答案相比,base 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"

这是另一种方法,与其他答案相比,base 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"

另一种基本方法可以是:

regmatches( Lines, gregexpr( "(?<=GN=).*?(?= PE)", Lines, perl = TRUE ) )

另一种基本方法可以是:

regmatches( Lines, gregexpr( "(?<=GN=).*?(?= PE)", Lines, perl = TRUE ) )

对于一行中有多个'PE'字符串的情况,您可以添加一个?到。*部分,使其不贪婪。。完整的正则表达式模式将变成?仅在一行中有多个'PE'字符串的情况下,您可以添加一个?到。*部分,使其不贪婪。。完整的正则表达式模式会变成什么?