Как определить, сколько элементов в векторе содержат шаблон из второго вектора? - PullRequest
3 голосов
/ 21 марта 2020

Я пытаюсь определить, содержит ли вектор несколько шаблонов. У меня есть векторы names и patterns.

. Для простого примера у меня есть:

names <- c("john_burgess", "pablo_gorges", "pear_trapper", "john_vaccant")

Я хотел бы знать, какой из элементов в names содержит один из следующие шаблоны:

patterns<- c("john", "gorge")

Мои фактические данные содержат вектор names [1: 1126] и вектор patterns [1: 1163]. Я был в состоянии работать только с одним шаблоном за раз, например, «Джон», но я хотел бы использовать все шаблоны одновременно. Мой желаемый результат выглядел бы примерно так (чтобы я мог затем продолжить и провести дальнейший анализ):

names         patterns
john_burgess  john
john_vaccant  john
pablo_gorges  gorge

Я так растерялся, просматривая grep, stringr::str_extract и dplyr::filter файлы справки и получать только ошибки, как только я пытаюсь использовать более одного шаблона. Я удалил _ в names, и это не имело никакого значения. Я знаю, что это должно быть возможно, и что это, вероятно, простое кодирование, но я просто не могу заставить его работать. Извините, если этот вопрос уже был задан и получен ответ (если да, пожалуйста, укажите на это)! Я был бы очень признателен за толчок в правильном направлении. Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 21 марта 2020

Вот вариант с tidyverse

library(purrr)
library(tibble)
library(stringr)
map(set_names(patterns, patterns), ~ 
      names[str_detect(names, .x)], .id = 'patterns') %>%
   enframe(name = "patterns", value = "names") %>% 
   unnest(c(names))
# A tibble: 3 x 2
#  patterns names       
#  <chr>    <chr>       
#1 john     john_burgess
#2 john     john_vaccant
#3 gorge    pablo_gorges

Или с использованием base R

stack(lapply(setNames(patterns, patterns), grep, x = names, value = TRUE))
2 голосов
/ 21 марта 2020

Вот базовое решение R, использующее regmatches

df <- data.frame(cbind(names,
                 patterns = regmatches(names,gregexpr(paste0(patterns,collapse = "|"),names))))

, такое, что

> df
         names patterns
1 john_burgess     john
2 pablo_gorges    gorge
3 pear_trapper         
4 john_vaccant     john

ДАННЫЕ

names <- c("john_burgess", "pablo_gorges", "pear_trapper", "john_vaccant")
patterns<- c("john", "gorge")
1 голос
/ 21 марта 2020

Одним из способов с stringr может быть вставка patterns и извлечение их с помощью str_extract.

library(stringr)

data.frame(names, patterns = str_extract(names, str_c(patterns, collapse = "|")))

#         names patterns
#1 john_burgess     john
#2 pablo_gorges    gorge
#3 pear_trapper     <NA>
#4 john_vaccant     john
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...