Как искать строки с круглыми скобками в R - PullRequest
0 голосов
/ 16 мая 2019

Используя R, у меня есть длинный список ключевых слов, которые я ищу в наборе данных. Чтобы включить одно из ключевых слов, необходимо заключить его в круглые скобки.

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

patterns<-c("dog","cat","(fish)")

data<-c("brown dog","black bear","salmon (fish)","red fish")

patterns2<- paste(patterns,collapse="|")

grepl(patterns2,data)

[1]  TRUE FALSE  TRUE  TRUE

Я бы хотел, чтобы salmon (fish) дал TRUE, а red fish - FALSE.

Спасибо!

Ответы [ 2 ]

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

Как отметил @joran в комментариях, шаблон должен выглядеть так:

patterns<-c("dog","cat","\\(fish\\)")

\\ s скажет R читать буквально скобки при поиске шаблона.

Самый простой способ добиться этого, если вы не хотите вносить изменения вручную:

patterns <- gsub("([()])","\\\\\\1", patterns)

Что приведет к:

[1] "dog" "cat" "\\(fish\\)"

Если вы не очень знакомы с регулярными выражениями, то здесь происходит то, что он ищет какой-либо один символ в квадратных скобках. Круглые квадратные скобки, которые говорят ему, чтобы сохранить то, что он находит, что соответствует содержанию. Затем первые четыре косые черты во втором аргументе говорят ему заменить найденное им двумя косыми чертами (каждые две косые черты переводятся в одну косую черту), а \\1 говорит ему добавить все, что было сохранено из первого аргумента, т.е. ( или ).

1 голос
/ 16 мая 2019

Другой вариант - забыть регулярное выражение и использовать grepl с fixed = T

rowSums(sapply(patterns, grepl, data, fixed = T)) > 0
# [1]  TRUE FALSE  TRUE FALSE
...