Извлеките все символы справа от списка возможных символов - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть ряд строк в кадре данных, как показано ниже:

item_time<-c("pink dress july noon", "shirt early september morning", "purple dress 
april", "tall purple shoes february")

И я хочу извлечь все символы справа от списка возможных символов, подобных этим:

item<-c("pink dress","shirt","purple dress", "tall purple shoes")

Результат, который я хочу, выглядел бы так:

[1] july noon
[2] early september morning
[3] april
[4] february

Я не могу разделить их пробелами, так как в списках времени и элементов различное количество слов. У меня также нет символа, который разделяет их. Я чувствую, что должен быть довольно простой и элегантный способ решения этой проблемы, но я не могу понять это.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Другой способ - использовать mapply

.
mapply(gsub,pattern=item,replacement='',x=item_time)

Если вы также хотите удалить пробел между item и правой частью item_time, вы можете вместо этого использовать:

mapply(gsub,pattern=paste0(item,' '),replacement='',x=item_time)
0 голосов
/ 04 сентября 2018

Вот еще один вариант использования stringr::str_replace(string, pattern, replacement), который имеет преимущество в том, что он векторизован как string, так и pattern (а также replacement).

trimws(stringr::str_replace(item_time, item, ""))
#[1] "july noon"               "early september morning"
#[3] "april"                   "february"

trimws удаляет начальные пробелы.

Обратите внимание, что для этого необходимо, чтобы item_time и item имели попарно совпадающие записи.

0 голосов
/ 04 сентября 2018

Вы можете сделать это с помощью sub и регулярного выражения.

Pat = paste0("(.*)(", paste0(item, collapse="|"), ")(.*)")
sub(Pat, "\\3", item_time)
[1] " july noon"               " early september morning"
[3] " april"                   " february"  

Подробности: Создан шаблон:

Pat
[1] "(.*)(pink dress|shirt|purple dress|tall purple shoes)(.*)"

Средняя часть "(.*)(pink dress|shirt|purple dress|tall purple shoes) соответствует любому из ваших паттернов. Первый (.*) соответствует чему-либо до шаблона. Второй (.*) соответствует чему-либо после шаблона. Затем оператор sub заменяет всю строку только частью после сопоставления с образцом.

...