【问题标题】:Test if a large number of whole words appear in a string variable using grepl [duplicate]使用 grepl 测试字符串变量中是否出现大量完整单词 [重复]
【发布时间】:2021-03-15 02:15:57
【问题描述】:

我正在尝试使用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”应该返回 TRUE,而“davidson”应该返回 FALSE。

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

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

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

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

提前致谢,注意安全!

【问题讨论】:

    标签: r regex match grepl


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 嗯,这很简单!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2015-11-12
    • 2012-09-21
    相关资源
    最近更新 更多