【问题标题】:Select a specific string from a complicated txt in R using dpylr使用 dplyr 从 R 中的复杂 txt 中选择特定字符串
【发布时间】:2021-03-02 23:02:09
【问题描述】:

我已经尝试了很长时间。我的数据框如下所示:

type=c("ID=gene:PFLU_4201;
       biotype=protein_coding;description=putative filamentous adhesin;gene_id=PFLU_4201;
       logic_name=ena", 
       "ID=gene:PFLU_5927;Name=algP1;biotype=protein_coding;
       description=transcriptional regulatory protein algp (alginate regulatory protein algr3);
       gene_id=PFLU_5927;logic_name=ena")

SNP=c(1, 2)

data=data.frame(type, SNP)

我想从类型列中仅隔离字符串 PFLU_*** 和我的数据,使其看起来像这样

type          SNP
PFLU_4201      1
PFLU_5927      2

欢迎任何帮助

【问题讨论】:

    标签: r dplyr datatable tidyverse


    【解决方案1】:

    我们可以在这里使用sub 作为基本 R 选项:

    data$type <- sub("^.*\\b(PFLU_\\d+)\\b.*$", "\\1", data$type)
    data
    
           type SNP
    1 PFLU_4201   1
    2 PFLU_5927   2
    

    使用的样本数据与您在原始问题中提供的数据相同。

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      library(stringr)
      new_data <- data %>% mutate(
        type = substr(type,str_locate(type,"PFLU_[0-9][0-9][0-9][0-9]")[,"start"],
                      str_locate(type,"PFLU_[0-9][0-9][0-9][0-9]")[,"end"]))
      

      如果您希望每行获得多个PFLU _ ****,可以使用str_locate_all 函数。

      【讨论】:

        【解决方案3】:

        假设ID=gene:PFLU_***gene_id=PFLU_*** 始终相同,您可以使用dplyrstringr 包中的mutatestr_extract 函数,它们都是tidyverse 的一部分。

        require(tidyverse)
        data<-data %>% 
          mutate(type = str_extract(type,"\\bPFLU_[:digit:]+\\b"))
        

        这会导致:

               type SNP
        1 PFLU_4201   1
        2 PFLU_5927   2
        

        如果有时它们不相同,您可以使用str_extract_allmap_chrstr_cuniquemap_chr 位于 purrr 包中,它也是 tidyverse 的一部分。

        require(tidyverse)
        data<-data %>% 
          mutate(type = map_chr(str_extract_all(type,"\\b(PFLU_[:digit:]+)+\\b"), ~ str_c(unique(.x), collapse=", ")))
        

        这将创建以逗号分隔的字符串,其中包含与 PFLU_ 匹配的所有实例,后跟每个 type 字符串的相邻数字。

        将第二个 PFLU_5927 更改为 PFLU_0000 将导致:

                          type SNP
        1            PFLU_4201   1
        2 PFLU_5927, PFLU_0000   2
        

        【讨论】:

          猜你喜欢
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-02
          • 2020-01-03
          • 2012-10-12
          • 2017-04-13
          • 1970-01-01
          相关资源
          最近更新 更多