Используя 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 <- gsub("\\(", "\\\\(", patterns); patterns <- gsub("\\)", "\\\\)", patterns);Или сразу: gsub("([()])","\\\\\\1", patterns) -> [1] "dog" "cat" "\\(fish\\)"
На этом этапе один из нас должен написать ответ. Я номинирую @iod. Лучшее решение + нужна репутация ;)
Это сработало! Спасибо!!





Как отметил @joran в комментариях, шаблон должен выглядеть так:
patterns<-c("dog","cat","\\(fish\\)")
\\ скажут R читать круглые скобки буквально при поиске шаблона.
Самый простой способ добиться этого, если вы не хотите вносить изменения вручную:
patterns <- gsub("([()])","\\\\\\1", patterns)
Что приведет к:
[1] "dog" "cat" "\\(fish\\)"
Если вы не очень хорошо знакомы с регулярными выражениями, то здесь происходит поиск любого символа в квадратных скобках. Круглые скобки вокруг этого говорят ему сохранять все, что он находит, что соответствует содержимому. Затем первые четыре косых черты во втором аргументе говорят ему заменить то, что он нашел, двумя косыми чертами (каждые две косые черты преобразуются в одну косую черту), а \\1 говорит ему добавить то, что он сохранил из первого аргумента, т. е. либо (, либо ).
Хороший ответ, под который безбожно затыкать fortunes::fortune(365).
Забавно, именно так я и пришел к своему решению!
Другой вариант — забыть регулярное выражение и использовать grepl с fixed = T.
rowSums(sapply(patterns, grepl, data, fixed = T)) > 0
# [1] TRUE FALSE TRUE FALSE
Вы хотите
patterns<-c("dog","cat","\\(fish\\)")для буквальных скобок.