5

样本数据

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.

4

2 回答 2

5

这不是为了繁重的工作,而是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

要检查字符串中是否存在所有模式,结果矩阵的每行逻辑运算符applyall

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
于 2016-09-11T18:47:37.810 回答
3

在网上搜索'r regex "and operator"''regex "and operator"'会导致R grep:是否有 AND 运算符?, 和正则表达式:是否有 AND 运算符?分别。

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

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

正如 Jota 在评论中提到的那样,通过匹配“4.0”这也将匹配其他字符串,因为句点是元字符。一种解决方法是转义模式字符串中的句点,即strings.to.find = c( "PA", "4\\.0")

于 2016-09-11T18:52:36.403 回答