#r #dplyr #stringr
Вопрос:
У меня есть вектор строк. Каждый элемент вектора соответствует строке упорядоченного текста. Последнее слово каждой строки может быть вырезано (или нет) черточкой и продолжено на следующей строке, следующем элементе вектора.
text <- c("Lorem ipsum dolor sit am-",
"et consectetur adipis-",
"cing Quisque euismod, ex vel -aliquam- vestibulum",
"Nulla lacinia volutpat ipsum sed condimentum")
Что я хочу :
восстановить вырезанные слова, сохраняя при этом расположение текста в абзацах.
Lorem ipsum dolor sit amet
consectetur adipiscing
Quisque euismod, ex vel -aliquam- vestibulum
Nulla lacinia volutpat ipsum sed condimentum
Чего я не хочу :
Lorem ipsum dolor sit amet consectetur adipiscing Quisque euismod, ex vel -aliquam- vestibulum Nulla lacinia volutpat ipsum sed condimentum
Что я сделал :
Я преобразовал строки вектора в массив данных, потому что я думаю, что функции в пакете dplyr (опережение и отставание) могут быть мне полезны.
textdf <- as.data.frame((text))
library(dplyr)
textdf <- textdf %>%
rename( text = '(text)')
Что, по — моему, следует сделать:
Если строка заканчивается тире, выберите первое слово следующей строки, удалите тире, вырежьте и вставьте слово в конце строки.
library(stringr)
textdf <- textdf %>%
mutate(text = str_replace(text, "-$", lag("^. \s")))
Ответ №1:
Вот способ —
library(dplyr)
data.frame(text) %>%
#The word end with "-"
mutate(cut_word = grepl('-
Комментарии:
1. Спасибо вам за вашу помощь.
, text),
#Remove the last "-"
text = sub('-
Комментарии:
1. Спасибо вам за вашу помощь.
, '', text),
#If cut_word get 1st word from next value and paste it in current value.
text = ifelse(cut_word, paste0(text, stringr::word(lead(text), 1)), text),
#Remove the first word if previous value has cut_word.
text = ifelse(lag(cut_word, default = FALSE), sub('.*?\s', '', text), text)) %>%
select(-cut_word)
# text
#1 Lorem ipsum dolor sit amet
#2 consectetur adipiscing
#3 Quisque euismod, ex vel -aliquam- vestibulum
#4 Nulla lacinia volutpat ipsum sed condimentum
Комментарии:
1. Спасибо вам за вашу помощь.