从 R 中另一个字符向量中的字符向量检测任何模式

detect any pattern from a character vector within another character vector in R

我想要 return 一个逻辑向量,所有元素的值为 TRUE,其中检测到来自另一个字符向量的任何元素。

示例数据:

lorem <- c("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
            "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
            "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")

例如,我想搜索元素 'sit' 和 'non'。

我试过了

str_detect(lorem, c('sit', 'non'))

str_detect(lorem, c('non', 'sit'))

这表明第二个参数可能正在被回收,所以调用 str_detect(lorem, c('sit', 'non')) 实际上发生如下:

c(str_detect(lorem[1], 'sit'), str_detect(lorem[2], 'non'), str_detect(lorem[3], 'sit'), str_detect(lorem[4], 'non'))

我最终想出了以下解决方案:

multi_string_detect<-function(x,y){
        temp<-sapply(y, function(z){str_detect(x, z)})
        apply(temp, 1, any)
}

multi_string_detect(lorem, c('sit', 'non')
[1]  TRUE FALSE FALSE  TRUE

是否有 clean/simpler 替代我的 multi_string_detect 功能?

另一种选择是将 pattern 折叠成带有 |

的单个字符串
library(stringr)
str_detect(lorem, str_c(c('non', 'sit'), collapse = "|"))
#[1]  TRUE FALSE FALSE  TRUE