Введение
Учитывая строку в R, возможно ли получить векторизованное решение (т.е. без циклов), где мы можем разбить строку на блоки, где каждый блок определяетсяn-е вхождение подстроки в строку.
Работа, выполненная с воспроизводимым примером
Предположим, у нас есть несколько абзацев известного текста Lorem Ipsum.
library(strex)
# devtools::install_github("aakosm/lipsum")
library(lipsum)
my.string = capture.output(lipsum(5))
my.string = paste(my.string, collapse = " ")
> my.string # (partial output)
# [1] "Lorem ipsum dolor ... id est laborum. "
Мы хотели бы разбить этот текст на сегменты в каждом 3-м вхождении слова "в" (пробелвключен для того, чтобы отличать слова, которые содержат «in» как часть их (например, «min»).
У меня есть следующее решение с циклом while:
# We wish to break up the string at every
# 3rd occurence of the worn "in"
break.character = " in"
break.occurrence = 3
string.list = list()
i = 1
# initialize string to send into the loop
current.string = my.string
while(length(current.string) > 0){
# Enter segment into the list which occurs BEFORE nth occurence character of interest
string.list[[i]] = str_before_nth(current.string, break.character, break.occurrence)
# Update next string to exmine.
# Next string to examine is current string AFTER nth occurence of character of interest
current.string = str_after_nth(current.string, break.character, break.occurrence)
i = i + 1
}
Мы можем получить желаемый результат в списке с предупреждением (предупреждение не показано)
> string.list (#partial output shown)
[[1]]
[1] "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit"
[[2]]
[1] " voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor"
...
[[6]]
[1] " voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor"
Цель
Можно ли улучшить это решение путем векторизации(то есть используя apply()
, lapply()
, mapply()
и т. д.).Кроме того, мое текущее решение обрезает последнее вхождение подстроки в блоке.
Текущее решение может не работать хорошо на очень длинных строках (таких как последовательности ДНК, где мы ищем блоки с n-м вхождениемподстрока нуклеотидов).