извлечь подстроки текста между двумя повторяющимися строками - PullRequest
2 голосов
/ 26 марта 2019

У меня есть датафрейм, созданный с использованием readtext ().У него есть два столбца: doc_id, text.Для каждой строки (doc_id) я хочу извлечь подстроку (в моем случае название правительственного департамента) между двумя строками, которые повторяются n раз в текстовом столбце.Например:

documents <- data.frame(doc_id = c("doc_1", "doc_2"),
                        text = c("PART 1 Department of Communications \n Matters \n Blah blah blah \n PART 2 Department of Forestry \n Matters \n Blah blah blah", "PART 1 Department of Communications \n Matters \n Blah blah blah \n PART 3 Department of Health \n Matters \n Blah blah blah \n PART 5 Department of Sport \n Matters \n Blah blah"))

Я хотел бы получить следующее:

"doc_1"  "Department of Communications, Department of Forestry"
"doc_2"  "Department of Communications, Department of Health, Department of Sport"

По сути, я хочу извлечь строку между PART и Matters.Я хотел бы использовать операции dplyr :: rowwise на фрейме данных, но не знаю, как извлечь несколько раз между двумя повторяющимися строками.

Ответы [ 3 ]

3 голосов
/ 26 марта 2019

Мы можем использовать str_match_all из stringr и извлекать слова между "PART" и "Matters".Он возвращает список из двух матриц столбцов, из которых мы выбираем второй столбец, который является группой захвата, и помещаем их в одну строку через запятую, используя toString.

out <- stringr::str_match_all(documents$text, "PART \\d+ (.*) \n Matters")
sapply(out, function(x) toString(x[, 2]))

#[1] "Department of Communications, Department of Forestry"                   
#[2] "Department of Communications, Department of Health, Department of Sport"
1 голос
/ 26 марта 2019

Я не могу сейчас придумать решение rowwise, но, может быть, это тоже поможет

library(dplyr)
documents %>%
  mutate(text=strsplit(as.character(text), 'PART ')) %>%
  tidyr::unnest(text) %>%
  mutate(text=trimws(sub('\\d+ (.*) Matters.*', '\\1', text))) %>%
  filter(text != '') %>%
  group_by(doc_id) %>%
  summarise(text=paste(text, collapse=', '))

Это в основном разбивает весь ваш текст на PART, и тогда мы можем работать над каждым элементом отдельновырезать важный текст из более длинной строки.Позже мы объединяем все вместе в doc_id.

0 голосов
/ 26 марта 2019
#Import Tidyverse
library(tidyverse)

#Use helper variable name to store resuts of the extracted departments based on the parttern
Helper <- str_extract_all(string = documents$text, pattern = "Department.*\\n")

#Clean Up the columns.
Helper1 <- lapply(Helper, FUN = str_replace_all, pattern=" \\n", replacement = ", ")
documents$Departments<-str_replace(str_trim(unlist(lapply(Helper1, FUN =paste, collapse= ""))), pattern = ",$", replacement = "")

#Remove Previous column of texts
documents <- select(documents, -c("text"))

Это дает enter image description here

...