Использование функции unnest в языке R для разделения ячеек Excel определенного столбца на основе регулярных выражений с получением повторяющихся результатов - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть вопрос, в настоящее время я пытаюсь разбить ячейки в файле 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 Ответ

0 голосов
/ 24 апреля 2018

используйте 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 != "")
...