使用 grepl 测试字符串变量中是否出现大量完整单词

Test if a large number of whole words appear in a string variable using grepl

我正在尝试使用 grepl 来测试一个字符串变量(大约 30,000 个案例)是否包含来自相对较大的单词列表(大约 1,000 个)的任何 完整单词 ) 字。这是一个例子:

###create string variable to be tested (note: real data has about 30,000 cases)
string <- c("clayville", "madison", "roberts", "david", "davidson")
df <- data.frame("id" = as.numeric(1:5), "string" = string, stringsAsFactors = FALSE)

###create a vector of words to test against string in df (note: real data has aobut 1,000 words)
test <- c("clay", "roberts", "david")

现在,我知道如何使用grepl来测试“test”的任何部分是否包含在“string”中,如下所示:

df$test <- grepl(paste(test, collapse = "|"), df$string)

给出以下内容:

id    string  test
1 clayville  TRUE
2   madison  FALSE
3   roberts  TRUE
4     david  TRUE
5  davidson  TRUE

当然,这并没有给我我想要的东西,因为我的代码没有考虑到我只对整个单词感兴趣的事实。例如,在我的示例数据中,“david”应该 return TRUE,而“davidson”应该 return FALSE。

我熟悉使用正则表达式来指定单词边界,例如\b,但是,当我想使用 OR 语句进行如此多的测试时,我不确定该怎么做。

我真正想要的是以下内容:

id    string  test
1 clayville  FALSE
2   madison  FALSE
3   roberts  TRUE
4     david  TRUE
5  davidson  FALSE

如能提供任何帮助,我们将不胜感激!

提前致谢,注意安全!

您可以使用 paste0 动态添加字边界:

df$test <- grepl(paste0('\b', test, '\b', collapse = '|'), df$string)
df
#  id    string  test
#1  1 clayville FALSE
#2  2   madison FALSE
#3  3   roberts  TRUE
#4  4     david  TRUE
#5  5  davidson FALSE