Как искать строки со скобками в R

Используя 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.

Спасибо!

Вы хотите patterns<-c("dog","cat","\\(fish\\)") для буквальных скобок.

joran 16.05.2019 20:45

Да, есть ли способ заменить все скобки в строке «шаблоны», чтобы перед ними стояли косые черты? У меня есть длинный список ключевых слов, и я хотел бы сделать это сразу для тех, у кого есть скобки.

user3381345 16.05.2019 20:48
patterns <- gsub("\\(", "\\\\(", patterns); patterns <- gsub("\\)", "\\\\)", patterns);
Gregor Thomas 16.05.2019 20:50

Или сразу: gsub("([()])","\\\\\\1", patterns) -> [1] "dog" "cat" "\\(fish\\)"

iod 16.05.2019 20:51

На этом этапе один из нас должен написать ответ. Я номинирую @iod. Лучшее решение + нужна репутация ;)

Gregor Thomas 16.05.2019 20:54

Это сработало! Спасибо!!

user3381345 16.05.2019 20:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
2 897
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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

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

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

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

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

Хороший ответ, под который безбожно затыкать fortunes::fortune(365).

joran 16.05.2019 21:18

Забавно, именно так я и пришел к своему решению!

iod 16.05.2019 21:58

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

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

Другие вопросы по теме