首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在R中提取数据帧中字符串的中间部分?

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

Stack Overflow用户
提问于 2019-06-04 22:52:25
回答 4查看 4K关注 0票数 5

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

代码语言:javascript
运行
复制
> 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工具,但是它不起作用。可能是因为我没有使用工具所要求的正确模式

代码语言:javascript
运行
复制
str_extract(A$Description, start = "GN=", end = " PE")

我想要一个有这些基因名称的数据框架。

代码语言:javascript
运行
复制
> head(pccmit$Description)
[1] NDRG4
[2] ATP6V1B2
[3] TF

谢谢大家,伙计们

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-04 23:07:16

使用stringr包:

代码语言:javascript
运行
复制
library(stringr)
str_extract(pccmit$Description, "(?<=GN=).*(?= PE)")

(?<=GN=)落后于GN=(?= PE),而(?= PE)则领先于= PE.*与所有的东西都匹配在中间。

票数 8
EN

Stack Overflow用户

发布于 2019-06-04 23:08:23

以下是一些替代方案。除(5)外,不使用任何包。

1)使用注释结尾所示的Lines,假设基因名称不包括任何空格,这将匹配到GN=的所有内容,然后捕获后续的非空格,然后将所有内容替换为捕获的部分,即GN=后面的非空格。不使用包装。

代码语言:javascript
运行
复制
sub(".*GN=(\\S+).*", "\\1", Lines)
## [1] "NDRG4"    "ATP6V1B2" "TF"       "GLS"      "AK1"      "SFXN1"   

2)另一种方法是删除直到并包含GN=的所有内容,然后从随后的空格开始删除所有内容:

代码语言:javascript
运行
复制
gsub(".*GN=|\\s.*", "", Lines)
## [1] "NDRG4"    "ATP6V1B2" "TF"       "GLS"      "AK1"      "SFXN1"   

3) read.dcf另一种选择是将数据转换为DCF格式,然后使用read.dcf读取数据。这将解析所有字段,并从生成矩阵m的数据本身派生它们的名称。

代码语言:javascript
运行
复制
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)派生字段。

代码语言:javascript
运行
复制
strcapture("(.*) OS=(.*) GN=(.*) PE=(.*) SV=(.*)", Lines,
  list(X = character(0), OS = character(0), GN = character(0), 
    PE = numeric(0), SV = numeric(0)))

给这个data.frame:

代码语言:javascript
运行
复制
                                              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=和非空白组成的模式,并将后者放在一个捕获组中,然后返回。这里有一个最简单的正则表达式。

代码语言:javascript
运行
复制
library(gsubfn)
strapplyc(Lines, "GN=(\\S+)", simplify = TRUE)
## [1] "NDRG4"    "ATP6V1B2" "TF"       "GLS"      "AK1"      "SFXN1"   

备注

代码语言:javascript
运行
复制
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")
票数 7
EN

Stack Overflow用户

发布于 2019-06-05 00:16:42

这是另一种方法(基R),与这里的其他答案相比,这肯定不是很好,但是好的(我猜)如果你不擅长正则表达式-

代码语言:javascript
运行
复制
x <- "Protein NDRG4 OS=Homo sapiens GN=NDRG4 PE=1 SV=2"

strsplit(x, " ") %>% 
  unlist() %>% 
  grep(pattern = "GN=", ., value = T) %>% 
  sub("GN=", "", .)

[1] "NDRG4"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56452306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档