Как передать несколько необходимых шаблонов в str_subset? - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь найти элементы в символьном векторе, которые соответствуют двум словам в произвольном порядке, а не только одному из них, с помощью функции stringr :: str_subset.Другими словами, я ищу пересечение, а не объединение двух слов.

Я пытался использовать оператор «или» (|), но это дает мне только одно из двух слов и возвращаетслишком много результатов.Я также попытался просто передать символьный вектор с двумя словами в качестве аргумента шаблона.Это просто возвращает ошибку «длинная длина объекта не кратна короткой длине объекта» и возвращает только значения, соответствующие второму из двух слов.

character_vector <- c("abc ghi jkl mno def", "pqr abc def", "abc jkl pqr")
pattern <- c("def", "pqr")

str_subset(character_vector, pattern)

Я ищу шаблонкоторый вернет только второй элемент символьного вектора, то есть "pqr abc def".

Ответы [ 3 ]

2 голосов
/ 16 мая 2019

Вы можете использовать чистый код R без цикла, используя регулярное выражение. Код такой:

character_vector[grepl(paste0("(?=.*",pattern,")",collapse = ""), character_vector, perl = TRUE)]

grepl найдет позицию персонажа, которая полностью заполняет регулярное выражение и условие внутри paste0.

2 голосов
/ 16 мая 2019

Поскольку вы ищете пересечение, вы можете использовать функцию intersect() и указать 2 шаблона, которые вы ищете

pattern_1 <- 'pqr'

pattern_2 <- 'def'

intersect( str_subset(character_vector, pattern_1), str_subset(character_vector, pattern_2) )

2 голосов
/ 16 мая 2019

Опция str_detect.Перейдите к циклу «pattern», проверьте, совпадают ли оба элемента «pattern» с «character_vector» (&), используйте логический вектор для extract элемента из «character_vector»

library(tidyverse)
map(pattern, str_detect, string = character_vector) %>%
    reduce(`&`) %>% 
    magrittr::extract(character_vector, .)
#[1] "pqr abc def"

Или используя str_subset

map(pattern, str_subset, string = character_vector) %>% 
         reduce(intersect)
#[1] "pqr abc def"
...