【问题标题】:How can we split string and extract the text between round brackets我们如何拆分字符串并提取圆括号之间的文本
【发布时间】:2020-12-21 19:25:57
【问题描述】:

我需要将数据框中的字符串拆分为两列,第一列包含圆括号之前的值,第二列包含圆括号内的值。 这是一个例子:

study_name = c("apple bannan (tcga, raw 2018)", "frame shift (mskk2 nature, 2000)" )
results= c("Untested", "tested")

df = data_frame(study_name,results)

这就是我尝试的方式:

df <- df %>% 
  mutate(reference = str_extract_all(study_name, "\\([^()]+\\)")) %>% 
  rename(~gsub("\\([^()]+\\)", "", study_name))

这是预期的数据框:

reference = c("(tcga, raw 2018)", "(mskk2 nature, 2000)")
study = c("apple bannan", "frame shift")

expexted_df = data_frame(study, reference)

【问题讨论】:

    标签: r regex tidyverse


    【解决方案1】:

    您可以使用separate()并将分隔符设置为"\\s(?=\\()"

    library(tidyr)
    
    df %>%
      separate(study_name, c("study", "reference"), sep = "\\s(?=\\()")
    
    # # A tibble: 2 x 3
    #   study        reference            results 
    #   <chr>        <chr>                <chr>   
    # 1 apple bannan (tcga, raw 2018)     Untested
    # 2 frame shift  (mskk2 nature, 2000) tested  
    

    如果要提取括号中的文字,使用extract()是一个合适的选择。

    df %>%
      extract(study_name, c("study", "reference"), regex = "(.+)\\s\\((.+)\\)")
    
    # # A tibble: 2 x 3
    #   study        reference          results 
    #   <chr>        <chr>              <chr>   
    # 1 apple bannan tcga, raw 2018     Untested
    # 2 frame shift  mskk2 nature, 2000 tested  
    

    【讨论】:

      【解决方案2】:

      我们可以这样使用str_extract

      library(stringr)
      df$reference <- str_extract(df$study_name, "\\(.*\\)")
      df$study <- str_extract(df$study_name, ".*(?= \\(.*\\))")
      

      结果:

      df
                              study_name  results            reference        study
      1    apple bannan (tcga, raw 2018) Untested     (tcga, raw 2018) apple bannan
      2 frame shift (mskk2 nature, 2000)   tested (mskk2 nature, 2000)  frame shift
      

      如果您不再需要 study_name 列,请将其删除:

      df$study_name <- NULL
      

      【讨论】:

        猜你喜欢
        • 2010-09-27
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 2020-02-10
        相关资源
        最近更新 更多