Фильтр, где есть как минимум два совпадения - PullRequest
2 голосов
/ 12 апреля 2019

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

Это еще более осложняется тем фактом, что некоторые из шаблонов уже являются или / или, например, чем-то вроде "paul|john".

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

На данный момент лучшее, что я могу придумать, это добавить столбец в таблицу data.table для каждого шаблона, проверить, соответствует ли каждый шаблон индивидуально, а затем отфильтровать по сумме шаблонов. Это кажется довольно запутанным, поэтому я надеюсь, что есть лучший способ, так как здесь достаточно много шаблонов для проверки!

Пример данных

text_table <- data.table(ID = (1:5), text = c("lucy, sarah and paul live on the same street",
                                              "lucy has only moved here recently",
                                              "lucy and sarah are cousins",
                                              "john is also new to the area",
                                              "paul and john have known each other a long time"))
text_patterns <- as.character(c("lucy", "sarah", "paul|john"))

С данными примера я бы хотел, чтобы идентификаторы 1 и 3 были в подмножестве данных.

Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 12 апреля 2019

Мы можем paste 'text_patterns' с |, использовать это в качестве шаблона в 'str_count', чтобы получить количество совпадающих подстрок, и проверить, больше ли оно 1, чтобы отфильтровать строки данных. таблица

library(data.table)
text_table[str_count(text, paste(text_patterns, collapse="|")) >1]
#    ID                                            text
#1:  1    lucy, sarah and paul live on the same street
#2:  3                      lucy and sarah are cousins
#3:  5 paul and john have known each other a long time

Обновление

Если нам нужно рассмотреть каждый 'text_pattern' как фиксированный шаблон, мы перебираем шаблоны, проверяем, присутствует ли шаблон (str_detect) и получаем sum всех шаблонов с + для создания логический вектор для подстановки строк

i1 <- text_table[, Reduce(`+`, lapply(text_patterns, 
       function(x) str_detect(text, x))) >1]
text_table[i1]
#    ID                                         text
#1:  1 lucy, sarah and paul live on the same street
#2:  3                   lucy and sarah are cousins
...