提问者:小点点

如何将多个必需的模式传递给stru子集?


我试图使用stringr::str_subset函数在字符向量中查找与两个单词没有特定顺序匹配的元素,而不仅仅是其中任何一个单词。换句话说,我在寻找交叉点,而不是两个词的并集。

我尝试使用或(|)运算符,但这只给我两个词中的任何一个,并返回太多的结果。我还尝试用两个单词作为模式参数传递一个字符向量。这只是返回“较长的对象长度不是较短对象长度的倍数”的错误,并且只返回与两个单词中的第二个匹配的值。

character_vector <- c("abc ghi jkl mno def", "pqr abc def", "abc jkl pqr")
pattern <- c("def", "pqr")

str_subset(character_vector, pattern)

我正在寻找只返回字符向量的第二个元素的模式,即“pqr abc def”。


共3个答案

匿名用户

一个选项是str\u detect。循环“模式”,检查两个“模式”元素是否与“字符向量”匹配(

library(tidyverse)
map(pattern, str_detect, string = character_vector) %>%
    reduce(`&`) %>% 
    magrittr::extract(character_vector, .)
#[1] "pqr abc def"

或者使用str_subset

map(pattern, str_subset, string = character_vector) %>% 
         reduce(intersect)
#[1] "pqr abc def"

匿名用户

您可以使用纯R代码,而不使用正则表达式进行循环。代码如下所示:

character_vector[grepl(paste0("(?=.*",pattern,")",collapse = ""), character_vector, perl = TRUE)]

grepl将在paste0中找到填充正则表达式和条件的字符的位置。

匿名用户

在查找intersect时,可以使用函数intersect(),并显式显示要查找的两种模式

pattern_1

pattern_2

intersect(stru子集(字符向量,模式1),stru子集(字符向量,模式2))