【问题标题】:How to extract the middle part of a string in a data frame in R?如何在R中的数据框中提取字符串的中间部分?
【发布时间】:2019-10-20 11:32:48
【问题描述】:

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

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

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

str_extract(A$Description, start = "GN=", end = " PE")

我希望有一个包含这些基因名称的数据框

> head(pccmit$Description)
[1] NDRG4
[2] ATP6V1B2
[3] TF

谢谢大家

【问题讨论】:

    标签: r string dataframe


    【解决方案1】:

    使用stringr 包:

    library(stringr)
    str_extract(pccmit$Description, "(?<=GN=).*(?= PE)")
    

    (?&lt;=GN=)GN= 后面看,(?= PE)= PE 前面看,.* 匹配中间的所有内容。

    【讨论】:

    • 仅对于一行中有多个 `PE` 字符串的情况,您可以在 .* 部分添加 ? 以使其不贪婪.. 完整的正则表达式模式将变成"(?&lt;=GN=).*?(?= PE)"
    【解决方案2】:

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

    1) sub 使用末尾注释中显示的Lines 并假设基因名称不包含任何空格,这将匹配 GN= 之前的所有内容,然后捕获后续的非空格然后将所有内容替换为捕获的部分,即 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 解析所有字段的另一种方法是使用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) strapplyc 指定一个由 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")
    

    【讨论】:

      【解决方案3】:

      这是另一种方式(基础 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"
      

      【讨论】:

        【解决方案4】:

        另一种基本方法可能是:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-14
          • 2015-09-19
          • 2019-07-12
          相关资源
          最近更新 更多