示例数据
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
的位置或顺序的正则表达式。
答案 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")