我正在尝试使用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”。
答案 0 :(得分:1)
一个选项是str_detect
。循环遍历“模式”,检查两个“模式”元素是否都与“ character_vector”(&
)匹配,使用逻辑矢量extract
从“ character_vector”中获取元素
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"
答案 1 :(得分:1)
您可以使用正则表达式在没有循环的情况下使用纯R代码。代码是这样的:
character_vector[grepl(paste0("(?=.*",pattern,")",collapse = ""), character_vector, perl = TRUE)]
grepl
将找到完全填充paste0内的正则表达式和条件的字符的位置。
答案 2 :(得分:1)
寻找相交时,可以使用函数intersect()
并明确显示要寻找的2种图案
pattern_1 <- 'pqr'
pattern_2 <- 'def'
intersect(
str_subset(character_vector, pattern_1),
str_subset(character_vector, pattern_2)
)
答案 3 :(得分:0)
这行得通吗?
character_vector %>% purrr::reduce(pattern, str_subset, .init = . )
[1] "pqr abc def"