Вот 2 tidyverse
способов.Я добавил дополнительную запись в ваш вектор, чтобы проверить, будут ли сравниваться все ключевые слова, а не только первое.
Поскольку вы сказали, что это df$a
, я сделал тиббл df
,который a
является единственным столбцом, просто для лучшего соответствия с dplyr
операциями, которые обычно основаны на фрейме данных.
library(tidyverse)
a <- c("hj**a**jk", "fgfg", "re", "rec")
df <- tibble(a = a)
keywords <- c("a", "b", "c")
Более dplyr
способ - начать с фрейма данных, а затемнаправить его в вашу операцию фильтрации.Проблема в том, что stringr::str_detect
работает здесь странно - он ожидает поиска совпадений по всему вектору, когда в этом случае мы хотим, чтобы это происходило для каждой строки.Добавление rowwise
позволяет вам сделать это и отфильтровать df
только для строк, где значение в a
соответствует любому из ключевых слов.
df %>%
rowwise() %>%
filter(str_detect(a, keywords) %>% any())
#> Source: local data frame [2 x 1]
#> Groups: <by row>
#>
#> # A tibble: 2 x 1
#> a
#> <chr>
#> 1 hj**a**jk
#> 2 rec
Этот второй способ был более интуитивным для меня, но подходитменьше на dplyr
пути.Я сопоставил a
- не столбец в df
, а только отдельный символьный вектор - чтобы проверить наличие совпадений.Затем я использовал это в качестве критерия фильтрации.Обычно dplyr
операции настраиваются, поэтому значение, которое вы передаете, является первым аргументом функции, обычно это фрейм данных.Но поскольку я на самом деле передавал второй аргумент filter
, а не первый, я указал df
для первого аргумента и использовал сокращение .
для второго.
a %>%
map_lgl(~str_detect(., keywords) %>% any()) %>%
filter(df, .)
#> # A tibble: 2 x 1
#> a
#> <chr>
#> 1 hj**a**jk
#> 2 rec
Созданна 2018-06-04 пакетом Представить (v0.2.0).