Есть ли функция R для извлечения текстового шаблона с использованием логических операторов - PullRequest
1 голос
/ 31 марта 2020

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

Например, если я рассматриваю следующие данные Я хотел бы найти все документы, где «Дожди и Германия» происходят вместе.

list_documents <- c("it rains in Germany", "it rains a lot in the field" , "the sun is shining in Germany")

Вывод будет выглядеть примерно так:

[1] TRUE
[2] FALSE
[3] FALSE 

Кто-нибудь знает, какой пакет мне использовать для этого? Я пробовал «str_extract», но логические операторы не работают с текстом. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Попробуйте grep Функция:

grepl('rains', list_documents, ignore.case = T) & grepl('germany', list_documents, ignore.case = T)

# [1]  TRUE FALSE FALSE

ИЛИ

grepl('rains.*germany|germany.*rains', list_documents, ignore.case = T)
0 голосов
/ 31 марта 2020

Вот решение Reduce.

patterns <- c("Rains", "Germany")
Reduce('&', lapply(patterns, function(x) grepl(x, list_documents, ignore.case = TRUE)))
#[1]  TRUE FALSE FALSE

Сначала оно создает список логических векторов, каждый из которых с результатом grepl применяется к каждому из шаблонов. Затем Reduce И члены списка в парах.

Обратите внимание, что вышеупомянутое решение все еще работает, если есть более 2 шаблонов для поиска и AND. Однострочник можно сделать функцией, на этот раз отделяющей создание списка и Reduce.

and_grepl <- function(pattern, x, ...){
  results <- lapply(pattern, function(p) grepl(p, x, ...))
  Reduce('&', results)
}

and_grepl(patterns, list_documents, ignore.case = TRUE)
#[1]  TRUE FALSE FALSE

pat <- c("A", "B", "C")
new_list <- c("ABCD", "ABCE", "ABDE", "DEFG")
and_grepl(pat, new_list)
#[1]  TRUE  TRUE FALSE FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...