Использование функции unnest в языке R для разделения ячеек Excel определенного столбца на основе регулярных выражений с получением повторяющихся результатов
У меня есть вопрос, в настоящее время я пытаюсь разбить ячейки в файле Excel таким образом, чтобы я мог разбить каждую строку, если эта строка начинается с цифры (и плюс для двузначных чисел), а за номером следует полная остановка ".", то есть определяется регулярным выражением, определенным в этой функции. Однако когда происходит фактическое разделение, выходные данные повторяются (зацикливаются) на основе других столбцов.
Здесь вы можете найти мои входные данные, текущий вывод и это желаемый результат.
# Load libraries
library('tidyverse')
library('readxl')
library('openxlsx')
# Set functions
do_split = function(x, pattern = "\\d+\\.\\s{1}"){
if( is_tibble(x) ){ x = pull(x) }
num_bullets = x %>% str_extract_all("\\d+\\. ") %>% unlist
x %>% str_split(pattern) %>% unlist %>% .[.!=""] %>% str_c(num_bullets,.) %>% list %>% return
}
# Read data
df = read_excel(path = '~/Desktop/master.xlsx')
# Wrangle data
o = df %>%
mutate(Result = Result %>% do_split, Steps = Steps %>% do_split) %>%
unnest(Result, Steps)
# Output file
write.xlsx(x = o, file = “out.xlsx”)
1 ответ
Решение
Использование rowwise()
так что ваша команда mutate используется в одной строке за раз...
df %>%
rowwise() %>%
mutate_at(vars(Result, Steps), funs(do_split(.))) %>%
unnest()
если вам не нужен разделитель (в вашем случае начальный номер, например, "1"), tidyr::separate_rows()
может быть проще / чище...
df %>%
separate_rows(Result, Steps, sep = "\\d+\\. ") %>%
filter(Result != "")