Поиск строк, для которых хотя бы одно ключевое слово частично соответствует - PullRequest
0 голосов
/ 04 июня 2018

У меня есть фрейм данных df со столбцом a с текстом.У меня также есть список слов

keywords <- c("a", "b", "c")

Как найти все строки df, где хотя бы один из keywords содержится в df$a?

Например, если df$a is:

hj**a**jk
fgfg
re

будет возвращена первая строка.

Я бы предпочел решение, которое использует пакет dplyr

1 Ответ

0 голосов
/ 04 июня 2018

Вот 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...