【问题标题】:Separate string into columns by extracting al groups that match regex通过提取与正则表达式匹配的所有组将字符串分成列
【发布时间】:2020-12-10 12:58:12
【问题描述】:

我在一列的每一行都有这些字符串。

example_df <- tibble(string = c("[{\"positieVergelekenMetSchooladvies\":\"boven niveau\",\"percentage\":9.090909090909092,\"percentageVergelijking\":19.843418733556412,\"volgorde\":10},{\"positieVergelekenMetSchooladvies\":\"op niveau\",\"percentage\":81.81818181818181,\"percentageVergelijking\":78.58821425834631,\"volgorde\":20},{\"positieVergelekenMetSchooladvies\":\"onder niveau\",\"percentage\":9.090909090909092,\"percentageVergelijking\":1.5683670080972694,\"volgorde\":30}]"))

我只对数字感兴趣。此正则表达式有效:

example_df %>% 
  .$string %>% 
  str_extract_all(., "[0-9]+\\.[0-9]+")

我想使用extract() 函数,而不是使用separate() 函数。我的理解是,它与separate() 的不同之处在于extract() 匹配您想要填充新列的正则表达式。 separate() 当然匹配分隔字符串。但是separate() 匹配你在sep= 填写的所有字符串extract() 只匹配一个组。

example_df %>% 
  extract(string, 
           into = c("boven_niveau_school",
                    "boven_niveau_verg",
                    "op_niveau_school",
                    "op_niveau_verg",
                    "onder_niveau_school",
                    "onder_niveau_verg"),
           regex = "([0-9]+\\.[0-9]+)")

我做错了什么?

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    我将从字符串中提取所有数字,而不是 separateextract,然后使用 unnest_wider 创建新列。

    library(tidyverse)
    
    example_df %>%
      mutate(temp = str_extract_all(string, "[0-9]+\\.[0-9]+")) %>%
      unnest_wider(temp)
    

    您可以根据自己的选择重命名列。

    【讨论】:

      【解决方案2】:

      我们可以从base R使用regmatches/regexpr

      out <- regmatches(example_df$string, gregexpr("\\d+\\.\\d+", example_df$string))[[1]]
      example_df[paste0("new", seq_along(out))] <- as.list(out)
      example_df
      # A tibble: 1 x 7
      #  string                                                                     new1        new2         new3        new4       new5       new6       
      #  <chr>                                                                      <chr>       <chr>        <chr>       <chr>      <chr>      <chr>      
      #1 "[{\"positieVergelekenMetSchooladvies\":\"boven niveau\",\"percentage\":9… 9.09090909… 19.84341873… 81.8181818… 78.588214… 9.0909090… 1.56836700…
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 2012-04-26
        • 2019-05-01
        • 2013-10-18
        • 2022-01-17
        相关资源
        最近更新 更多