Разделите строку на столбцы, извлекая все группы, соответствующие регулярному выражению

#r #tidyr

#r #тидыр

Вопрос:

У меня есть эти строки в каждой строке одного столбца.

 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] ")
 

Вместо того, чтобы использовать separate() функцию, я хочу использовать extract() функцию. Насколько я понимаю, он отличается от 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] )")
 

Что я делаю не так?

Ответ №1:

Вместо separate or extract я бы извлек все числа из строки, а затем использовал unnest_wider для создания новых столбцов.

 library(tidyverse)

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

Вы можете переименовать столбцы по своему выбору.

Ответ №2:

Мы можем использовать regmatches/regexpr из base R

 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…