使用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
。
谢谢!
答案 0 :(得分:2)
@joran在评论中指出,该模式应如下所示:
patterns<-c("dog","cat","\\(fish\\)")
\\
会告诉R在搜索模式时从字面上读取括号。
如果不想手动进行更改,最简单的方法:
patterns <- gsub("([()])","\\\\\\1", patterns)
这将导致:
[1] "dog" "cat" "\\(fish\\)"
如果您对正则表达式不是很熟悉,这里发生的是它会在方括号内查找任何一个字符。圆括号告诉它保存与内容匹配的所有内容。然后,第二个参数中的前四个斜杠告诉它用两个斜杠替换发现的内容(每个两个斜杠转换为一个斜杠),\\1
告诉它添加从第一个参数保存的所有内容,即,(
或)
。
答案 1 :(得分:1)
另一种选择是忘记正则表达式,并将grepl
与fixed = T
一起使用
rowSums(sapply(patterns, grepl, data, fixed = T)) > 0
# [1] TRUE FALSE TRUE FALSE