Использование функции 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 != "")
Другие вопросы по тегам