【问题标题】:Remove entries from string vector containing specific characters in R [duplicate]从包含 R 中特定字符的字符串向量中删除条目 [重复]
【发布时间】:2017-04-14 14:22:24
【问题描述】:

我有两个字符向量:

x = {"a", "b", "c", "kt"}
y = {"abs", "kot", "ccf", "okt", "kk", "y"}

我需要使用 x 从 y 中删除条目,以便只保留不包含任何 x 条目的字符串,如下所示:

y = {"kot", "kk", "y"}

该代码适用于任意大小的向量 x 和 y。

到目前为止,我已尝试使用 gsub 和 grepl,但它们仅适用于单个字符串。我试图创建一个循环来执行此操作,但问题似乎比我想象的要困难。当然,解决方案越复杂越好,但您可以假设在这种情况下,向量 x 和 y 最多有 200 个条目。

【问题讨论】:

    标签: r string character gsub grepl


    【解决方案1】:

    我们可以使用grep 找出y 中的哪些值与x 中的模式匹配,并使用!%in% 排除它们

    y[!y %in% grep(paste0(x, collapse = "|"), y, value = T)]
    
    #[1] "kot" "kk"  "y"  
    

    grepl 甚至更好,因为它返回布尔向量

    y[!grepl(paste0(x, collapse = "|"), y)]
    

    使用invertvalue 参数的grep 的简洁版本

    grep(paste0(x, collapse = "|"), y, invert = TRUE, value = TRUE)
    #[1] "kot" "kk"  "y"  
    

    【讨论】:

      【解决方案2】:

      @Ronak 给出的答案看起来比我的要好,但一种选择是使用 sapplygrepl 来获得与 y 的匹配矩阵,对于 x 中的每个条目,然后滚动它再次致电apply

      > y[!apply(sapply(x, function(q) {grepl(q, y)}), 1, function(x) {sum(as.numeric(x)) > 0})]
      [1] "kot" "kk"  "y"  
      

      这就是我所说的匹配矩阵:

      > sapply(x, function(q) { grepl(q, y) })
               a     b     c    kt
      [1,]  TRUE  TRUE FALSE FALSE
      [2,] FALSE FALSE FALSE FALSE
      [3,] FALSE FALSE  TRUE FALSE
      [4,] FALSE FALSE FALSE  TRUE
      [5,] FALSE FALSE FALSE FALSE
      [6,] FALSE FALSE FALSE FALSE
             ^^^^ each column is a match result for each element of x
      

      【讨论】:

      • 我同意 akrun。这很有帮助,但在这种情况下,我更喜欢 grepl 解决方案,因为我的向量不是那么长。
      【解决方案3】:

      这也应该有效:

      y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0]
      # [1] "kot" "kk"  "y"  
      

      【讨论】:

        猜你喜欢
        • 2018-08-08
        • 2014-04-10
        • 2016-01-05
        • 2012-10-21
        • 1970-01-01
        相关资源
        最近更新 更多