R - 查找包含所有字符串/模式的所有向量元素 - str_detect grep

时间:2016-09-11 18:19:31

标签: r stringr grepl and-operator

示例数据

files.in.path = c("a.4.0. name 2015 - NY.RDS", 
                  "b.4.0. name 2016 - CA.RDS", 
                  "c.4.0. name 2015 - PA.RDS")
strings.to.find = c("4.0", "PA")

我想要逻辑向量,它显示包含所有strings.to.find的所有元素。结果想要:

FALSE FALSE TRUE

此代码将查找包含strings.to.find中任何一个的元素,即使用OR运算符

str_detect(files.in.path, str_c(strings.to.find, collapse="|")) # OR operator
 TRUE TRUE TRUE

此代码尝试使用AND运算符但不起作用。

str_detect(files.in.path, str_c(strings.to.find, collapse="&")) # AND operator
FALSE FALSE FALSE

这可以在多行中使用,我可以编写一个for循环,为strings.to.find

的大量案例生成所有单独的行
det.1 = str_detect(files.in.path,      "4.0"  )   
det.2 = str_detect(files.in.path,      "PA"  )   
det.all = det.1 & det.2
 FALSE FALSE  TRUE

但有没有更好的方法不涉及使用依赖于strings.to.find的位置或顺序的正则表达式。

2 个答案:

答案 0 :(得分:3)

这不适用于繁重的工作,但是str_detect会在字符串和模式上进行矢量化,因此您可以将其与outer函数结合使用以获取紧密结果:

library(stringr)
outer(files.in.path, strings.to.find, str_detect)

#     [,1]  [,2]
#[1,] TRUE FALSE
#[2,] TRUE FALSE
#[3,] TRUE  TRUE

要检查字符串中是否存在所有模式,apply生成矩阵的每行all逻辑运算符:

apply(outer(files.in.path, strings.to.find, str_detect), 1, all)

#[1] FALSE FALSE  TRUE

或者根据@Jota评论,如果您正在查看的模式应该完全匹配,stri_detect_fixed将更安全地使用此处:

library(stringi)
apply(outer(files.in.path, strings.to.find, stri_detect_fixed), 1, all)
# [1] FALSE FALSE  TRUE

答案 1 :(得分:3)

在网络上搜索' regex"和operaror"' ' regex"以及运算符"' 分别指向R grep: is there an AND operator?Regular Expressions: Is there an AND operator?

因此,匹配两种模式将字符串连接在一起

str <- paste0("(?=.*", strings.to.find,")", collapse="") 
grepl(str, files.in.path, perl=TRUE)

正如Jota在评论中提到的匹配&#34; 4.0&#34;这也将与其他叮咬相匹配,因为时期是元字符。一个解决方法是逃避模式字符串中的句点,即strings.to.find = c( "PA", "4\\.0")