【问题标题】:R Match character vectorsR匹配字符向量
【发布时间】:2026-02-22 03:00:02
【问题描述】:

var1 是一个字符向量

var1 <- c("tax evasion", "all taxes", "payment")

而var2是另一个字符向量

var2 <- c("bill", "income tax", "sales taxes")

想要比较 var1 和 var2 并提取具有部分单词匹配的术语,例如,在这种情况下所需的答案将是以下字符向量:

"tax evasion", "all taxes", "income tax", "sales taxes"

我试过了

sapply(var1, grep, var2, ignore.case=T,value=T)

但没有得到想要的答案。怎么办?

谢谢。

【问题讨论】:

    标签: r pattern-matching string-matching


    【解决方案1】:

    你可以这样做(为了代码的清晰,我使用了 magrittr 包):

    library(magrittr)
    
    findIn = function(u, v)
    {
        strsplit(u,' ') %>%
            unlist %>%
            sapply(grep, value=T, x=v) %>%
            unlist %>%
            unique
    }
    
    unique(c(findIn(var1, var2), findIn(var2, var1)))
    #[1] "income tax"  "sales taxes" "tax evasion" "all taxes"
    

    【讨论】:

    • 在 2 分钟内,我实际上有时间将其全部复制并格式化 :) 我自己开发了它,但您更快,发布时没有看到您的答案。顺便说一句,如果两个列表有一个共同的句子,你需要在最后唯一。
    • 是的,你是对的,最后需要unique。我不是说你抄袭。我看到了相似之处,所以我发表了评论。
    • @akrun 你为什么删除你的答案?
    • @akrun 人们也支持并接受不使用其他软件包(例如 magrittr)的答案。您的回答没有使用其他软件包。虽然 Beauvel 上校的回答也很有用。
    • @john 如果你坚持,我会取消删除它,尽管我喜欢 ColonelBeauvel 对问题的优雅处理
    【解决方案2】:

    也许你需要

    lst1 <- strsplit(var1, ' ')
    lst2 <- strsplit(var2, ' ')
    
    indx1 <- sapply(lst1, function(x) any(grepl(paste(unlist(lst2), 
           collapse="|"), x)))
    indx2 <- sapply(lst2, function(x) any(grepl(paste(unlist(lst1),
           collapse="|"), x)))
    c(var1[indx1], var2[indx2])
    #[1] "tax evasion" "all taxes"   "income tax"  "sales taxes"
    

    如果 var1 和 var2 之间存在相交,请使用 unique 进行包装,就像 @ColonelBeauvel 在其优雅的解决方案中所做的那样。

    【讨论】:

    • 谢谢阿克伦和博维尔上校。您的两个答案都很优雅,尽管我个人更喜欢使用较少或不使用额外包的答案。