【问题标题】:Check coincidence between a string and a vector of words in R [duplicate]检查R中的字符串和单词向量之间的重合[重复]
【发布时间】:2019-07-12 21:39:43
【问题描述】:

我正在使用字符串处理R。我的数据框DF 具有下一个结构:

DF <- data.frame(v1=c(1,2,3),v2=c("Oranges are fruits","Hit music","Ferrari is red"),stringsAsFactors = F)

  v1                 v2
1  1 Oranges are fruits
2  2          Hit music
3  3     Ferrari is red

我有一个向量d,其中包含:

d <- c("fruits","red")

我正在寻找一种方法来测试v2 中的所有字符串是否与d 重合。这样,我尝试了下一段代码:

DF$v3 <- grepl(d,DF$v2)

但我得到了这个结果:

  v1                 v2    v3
1  1 Oranges are fruits  TRUE
2  2          Hit music FALSE
3  3     Ferrari is red FALSE

这是不正确的,因为v2 的第三行中的字符串具有包含在d 中的单词red。有没有办法获得这样的输出:

  v1                 v2    v3
1  1 Oranges are fruits  TRUE
2  2          Hit music FALSE
3  3     Ferrari is red  TRUE

我的原始数据集更大,DF 是其中的一个样本。非常感谢您的帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    来自?grepl,关于pattern 参数:

    如果提供长度为 2 或更大的字符向量,则使用第一个元素

    所以提供长度 2 d 将只搜索 fruits

    要查看d 中的任何字符串是否匹配,您可以使用any 和迭代的方法,或者使用| 符号折叠d,以用作如下模式。请注意,在此示例中,“He was barred”之类的句子将匹配“red”。

    DF <- data.frame(v1 = c(1, 2, 3), v2 = c("Oranges are fruits", "Hit music", "Ferrari is red"), stringsAsFactors = F)
    d <- c("fruits", "red")
    
    DF$v3 <- grepl(paste0(d, collapse = "|"), DF$v2)
    DF
    #>   v1                 v2    v3
    #> 1  1 Oranges are fruits  TRUE
    #> 2  2          Hit music FALSE
    #> 3  3     Ferrari is red  TRUE
    

    reprex package (v0.3.0) 于 2019 年 7 月 12 日创建

    【讨论】:

      【解决方案2】:

      一种方法是将applygrepl 一起使用两次。它基本上是在做一个双循环。对于 v2 中的每个元素,将 grepl 应用于 d 的每个元素。

      DF$v3 <- sapply(DF$v2, FUN = function(s) any(sapply(d, FUN = grepl, s)))
      DF
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-17
        • 2019-04-26
        • 1970-01-01
        • 2017-02-04
        • 1970-01-01
        相关资源
        最近更新 更多