#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…