【问题标题】:R extract variables with regexR用正则表达式提取变量
【发布时间】:2021-07-05 23:23:03
【问题描述】:

我有一个字符列需要用正则表达式分隔。以下是原始数据的示例:

data_raw <- tribble(
  ~census_geo,
  "Division No.  1, Subd. V (SNO), Newfoundland and Labrador",
  "Portugal Cove South (T), Newfoundland and Labrador",
  "Division No.  1, Subd. U, Reserve (SNO), Newfoundland and Labrador")

我们要提取三列。第一个是括号前的所有内容。第二列是括号内的单词。最后一列是最后一个逗号之后的所有内容(或括号中单词之后的所有内容)。以下是干净输出的示例:

data_clean <- tribble(
  ~csd_name, ~csd_type, ~province,
  "Division No.  1, Subd. V", "SNO", "Newfoundland and Labrador", 
  "Portugal Cove South", "T",  "Ontario", 
  "Division No.  1, Subd. U, Reserve", "SNO", "Newfoundland and Labrador")

我可以用这段代码提取最后一列:

data_raw %>% 
  mutate(csd_type = str_extract(census_geo, pattern = "(?<=\\().*(?=\\))"))

但我无法获取其他两列。

任何帮助将不胜感激。

【问题讨论】:

    标签: r regex tidyverse stringr


    【解决方案1】:

    您可以使用tidyrextract 并传递正则表达式来提取不同列中的相关文本。

    tidyr::extract(data_raw, census_geo, c('csd_name', 'csd_type', 'province'), 
                  '(.*) \\((.*)\\),\\s*(.*)')
    
    #  csd_name                          csd_type province                 
    #  <chr>                             <chr>    <chr>                    
    #1 Division No.  1, Subd. V          SNO      Newfoundland and Labrador
    #2 Portugal Cove South               T        Newfoundland and Labrador
    #3 Division No.  1, Subd. U, Reserve SNO      Newfoundland and Labrador
    

    您可以使用 strcapture 在 base R 中获得相同的结果:

    strcapture('(.*) \\((.*)\\),\\s*(.*)', data_raw$census_geo, 
       proto = list(csd_name = character(), csd_type = character(), 
                    province = character()))
    

    【讨论】:

      【解决方案2】:

      我知道您已经选择了 Ronak Shah 的答案(顺便说一句,这非常好),但我只想展示一种使用 stringrseparate 的方法:

      library(stringr)
      
      data_raw %>% 
        separate(
          col = census_geo, 
          into = c('csd_name', 'csd_type', 'province'),
          sep = '(\\s\\(|\\),\\s)'
        )
      

      \\s 用于空格,\\( 用于括号,| 用于拆分两个不同的模式以查找。

      【讨论】:

        【解决方案3】:

        以防 OP 有兴趣了解 str_extract 的原始方法如何适用于使用负字符类 [^)(][^,] 的所有三个单独的列:

        data_raw %>% 
          mutate(
            csd_name = str_extract(census_geo, "^[^)(]+(?=\\s)"),
            csd_type = str_extract(census_geo, "(?<=\\()[^)(]+(?=\\))"),
            csd_province = str_extract(census_geo, "(?<=,\\s)[^,]+$")) %>%
          select(-census_geo)
        # A tibble: 3 x 3
          csd_name                          csd_type csd_province             
          <chr>                             <chr>    <chr>                    
        1 Division No.  1, Subd. V          SNO      Newfoundland and Labrador
        2 Portugal Cove South               T        Newfoundland and Labrador
        3 Division No.  1, Subd. U, Reserve SNO      Newfoundland and Labrador
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-27
          • 1970-01-01
          • 1970-01-01
          • 2015-05-16
          • 1970-01-01
          • 2013-07-25
          • 1970-01-01
          • 2012-07-07
          相关资源
          最近更新 更多