【问题标题】:Exclude multiple words from a vector with grepl [duplicate]使用 grepl 从向量中排除多个单词 [重复]
【发布时间】:2015-05-20 09:55:27
【问题描述】:

这里的示例数据:

exclude.words <- c("zoznam","azet","dovera","joj","alza","telecom","google","post","sme")

main.data <- c("zoznam","registration","azet","azet.com","dovera","dna","joj","alza","telecom","google","post","sme")

如果单词相等(完全匹配),则此方法有效,但是请参阅azet.com 不会被排除在外!为此,我们可以使用agrepl()

main.data[!(main.data %in% exclude.words)]

那么如何将agrepl 与两个向量一起使用呢?

main.data[!agrepl(main.data, exclude.words)]

【问题讨论】:

  • main.data[!grepl(paste(exclude.words, collapse = "|"), main.data)]?
  • 是的,就是这样,有效。您是否会扩展您的答案(如果您选择提交)collapse=" | " 背后的含义?我不明白这个概念。

标签: r


【解决方案1】:

正如评论,您可以使用:

main.data[!grepl(paste(exclude.words, collapse = "|"), main.data)]

排除在 main.data 和 exclude.words 之间部分或完全匹配的任何单词。

paste(exclude.words, collapse = "|")

用“|”创建一个字符串(逻辑或)exclude.words 之间可以用作grepl 中的单个模式。因此,您无需遍历单个单词。

【讨论】:

    【解决方案2】:
    main.data[!as.logical(rowSums(sapply(exclude.words, function(x) agrepl(x, main.data))))]
    # [1] "registration" "dna"
    
    
    # clarification
    sapply(exclude.words, function(x) agrepl(x, main.data))
    #       zoznam  azet dovera   joj  alza telecom google  post   sme
    #  [1,]   TRUE FALSE  FALSE FALSE FALSE   FALSE  FALSE FALSE FALSE
    #  [2,]  FALSE FALSE  FALSE FALSE FALSE   FALSE  FALSE FALSE FALSE
    #  [3,]  FALSE  TRUE  FALSE FALSE FALSE   FALSE  FALSE FALSE FALSE
    #  [4,]  FALSE  TRUE  FALSE FALSE FALSE   FALSE  FALSE FALSE FALSE
    #  [5,]  FALSE FALSE   TRUE FALSE FALSE   FALSE  FALSE FALSE FALSE
    #  [6,]  FALSE FALSE  FALSE FALSE FALSE   FALSE  FALSE FALSE FALSE
    #  [7,]  FALSE FALSE  FALSE  TRUE FALSE   FALSE  FALSE FALSE FALSE
    #  [8,]  FALSE FALSE  FALSE FALSE  TRUE   FALSE  FALSE FALSE FALSE
    #  [9,]  FALSE FALSE  FALSE FALSE FALSE    TRUE  FALSE FALSE FALSE
    # [10,]  FALSE FALSE  FALSE FALSE FALSE   FALSE   TRUE FALSE FALSE
    # [11,]  FALSE FALSE  FALSE FALSE FALSE   FALSE  FALSE  TRUE FALSE
    # [12,]  FALSE FALSE  FALSE FALSE FALSE   FALSE  FALSE FALSE  TRUE
    

    【讨论】:

    • 原创方法,+1
    • 谢谢)不幸的是它有点慢
    【解决方案3】:

    您可以使用这种函数式编程方法:

    library(functional)
    
    funcs = lapply(exclude.words, function(u) function(x) x[!grepl(u, x)])
    
    Reduce(Compose, funcs)(main.data)
    #[1] "registration" "dna" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      相关资源
      最近更新 更多