如何在R中提取数据帧中字符串的中间部分?
我有一个蛋白质组数据框架,有几列。其中一个叫做描述,其中我们有蛋白质、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 我希望有一个包含这些基因名称的数据框如何在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
> 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'字符串的情况下,您可以添加一个?到。*部分,使其不贪婪。。完整的正则表达式模式会变成什么?