问题描述
假设我有样本字符串
sample1 <- "i have a nasty cough today"
sample2 <- "do yall like nasty burgers"
我想检查它是否包含我正在寻找的名词和其他相关关键字。例如:
nouns <- c("i","you","we")
keywords <- c("cough","tomorrow","nasty")
该函数应该对 function(sample1) 返回 TRUE,对 function(sample2) 返回 FALSE,因为 sample2 没有来自我指定向量的名词,即使它有关键字。
我熟悉 sjmisc 包中的 str_contains(),但不确定如何将其扩展到两个向量的组合。
解决方法
您可以将 nouns
和 keywords
组合成一个模式,并检查它们是否都出现在字符串中。
nouns <- c("i","you","we")
keywords <- c("cough","tomorrow","nasty")
check_keyword <- function(x) {
grepl(paste0('\\b',nouns,'\\b',collapse = '|'),x) &
grepl(paste0('\\b',keywords,x)
}
sample1 <- "i have a nasty cough today"
sample2 <- "do yall like nasty burgers"
check_keyword(sample1)
#[1] TRUE
check_keyword(sample2)
#[1] FALSE
,
您可以将关键字和样本都放入 list
中。对于前者,我们同时应用一个函数 mkPat
,它已经准备好所需的模式。
mkPat <- function(x) do.call(paste,c(list(paste0("\\b",x,"\\b")),collapse="|"))
kw <- lapply(list(nouns,keywords),mkPat)
smp <- list(sample1,sample2,sample3)
然后我们就可以轻松使用sapply
sapply(kw,grepl,smp)
# [,1] [,2]
# [1,] TRUE TRUE
# [2,] FALSE TRUE
# [3,] FALSE FALSE
并查看 rowSums
(TRUE
的)等于 2 的位置。
rowSums(sapply(kw,smp)) == 2
# [1] TRUE FALSE FALSE
数据:
sample1 <- "i have a nasty cough today"
sample2 <- "do yall like nasty burgers"
sample3 <- "do yall like tasty burgers"