Разделение и группировка простого текста (группировка текста по главам в кадре данных)?
У меня есть фрейм данных / Tibble, где я импортировал файл простого текста (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 ответ
Основано на "Иногда текст главы состоит только из одной строки, иногда из нескольких строк" Я предполагаю, что текст в строках 6 и 7 относится к главе 3, и в ваших тестовых данных нет текста для главы 4 (ваш желаемый результат, вероятно, немного неправильно).
Вот способ использования 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))