Разделение и группировка простого текста (группировка текста по главам в кадре данных)? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть фрейм / таблица данных, куда я импортировал файл простого текста (txt).Текст очень последовательный и сгруппирован по главам.Иногда текст главы - только одна строка, иногда - несколько строк.Данные в одном столбце, например:

# A tibble: 10,708 x 1
   x                                                                     
   <chr>                                                                                                                                   
 1 "Chapter 1 "                                                          
 2 "Chapter text. "     
 3 "Chapter 2 "                                                          
 4 "Chapter text. "    
 5 "Chapter 3 "
 6 "Chapter text. "
 7 "Chapter text. "
 8 "Chapter 4 "   

Я пытаюсь очистить данные, чтобы получить новый столбец для главы и текст из каждой главы в другом столбце, например:

# A tibble: 10,548 x 2
   x                                Chapter   
   <chr>                             <chr>
 1 "Chapter text. "               "Chapter 1 "
 2 "Chapter text. "               "Chapter 2 "
 3 "Chapter text. "               "Chapter 3 " 
 4 "Chapter text. "               "Chapter 4 " 

Я пытался использовать регулярные выражения, чтобы разделить и сгруппировать данные в каждом вхождении слова 'Глава №' (глава, за которой следует число, но не могу получить желаемый результат. Любой совет очень ценится.

1 Ответ

0 голосов
/ 21 ноября 2018

На основе "Иногда текст главы - это только одна строка, иногда это несколько строк" Я предполагаю, что текст в строках 6 и 7 относится к главе 3, и в вашем тесте нет текста для главы 4data (Ваш желаемый вывод, вероятно, немного неправильный).

Вот способ использования dplyr и tidyr.Просто запустите его по частям, и вы увидите, как преобразуются данные.

df %>% 
  mutate(
    id = cumsum(grepl("[0-9].$", x)),
    x = ifelse(grepl("[0-9].$", x), paste0(x, ":"), x)
  ) %>% 
  group_by(id) %>% 
  summarize(
    chapter = paste0(x, collapse = "")
  ) %>% 
  separate(chapter, into = c("chapter", "text"), sep = ":", extra = "merge")

# A tibble: 4 x 3
     id chapter      text                          
  <int> <chr>        <chr>                         
1     1 "Chapter 1 " "Chapter text. "              
2     2 "Chapter 2 " "Chapter text. "              
3     3 "Chapter 3 " "Chapter text. Chapter text. "
4     4 "Chapter 4 " ""     

Данные -

df <- structure(list(x = c("Chapter 1 ", "Chapter text. ", "Chapter 2 ", 
"Chapter text. ", "Chapter 3 ", "Chapter text. ", "Chapter text. ", 
"Chapter 4 ")), .Names = "x", class = "data.frame", row.names = c(NA, 
-8L))
...