【问题标题】:Remove strings found in vector 1, from vector 2从向量 2 中删除向量 1 中的字符串
【发布时间】:2016-01-19 09:26:32
【问题描述】:

我有这两个向量:

sample1 <- c(".aaa", ".aarp", ".abb", ".abbott", ".abogado")
sample2 <- c("try1.aarp", "www.tryagain.aaa", "255.255.255.255", "onemoretry.abb.abogado")

我正在尝试删除在 sample2 中找到的 sample1 字符串。我得到的最接近的是使用sapply 进行迭代,这给了我这个:

 sapply(sample1, function(i)gsub(i, "", sample2))

     .aaa                     .aarp                    .abb                 .abbott                  .abogado          
[1,] "try1.aarp"              "try1"                   "try1.aarp"          "try1.aarp"              "try1.aarp"       
[2,] "www.tryagain"           "www.tryagain.aaa"       "www.tryagain.aaa"   "www.tryagain.aaa"       "www.tryagain.aaa"
[3,] "255.255.255.255"        "255.255.255.255"        "255.255.255.255"    "255.255.255.255"        "255.255.255.255" 
[4,] "onemoretry.abb.abogado" "onemoretry.abb.abogado" "onemoretry.abogado" "onemoretry.abb.abogado" "onemoretry.abb"  

当然预期的输出应该是

[1] "www.tryagain"    "try1"            "onemoretry"      "255.255.255.255"

感谢您的宝贵时间。

【问题讨论】:

    标签: r gsub sapply


    【解决方案1】:

    试试这个,

    sample1 <- c(".aaa", ".aarp", ".abb", ".abbott", ".abogado")
    sample2 <- c("try1.aarp", "www.tryagain.aaa", "255.255.255.255", "onemoretry.abb.abogado")
    paste0("(",paste(sub("\\.", "\\\\.", sample1), collapse="|"),")\\b")
    # [1] "(\\.aaa|\\.aarp|\\.abb|\\.abbott|\\.abogado)\\b"
    gsub(paste0("(",paste(sub("\\.", "\\\\.", sample1), collapse="|"),")\\b"), "", sample2)
    # [1] "try1"            "www.tryagain"    "255.255.255.255" "onemoretry" 
    

    解释:

    • sub("\\.", "\\\\.", sample1) 转义所有点。因为点是正则表达式中的特殊字符。

    • paste(sub("\\.", "\\\\.", sample1), collapse="|") 将所有元素以| 作为分隔符。

    • paste0("(",paste(sub("\\.", "\\\\.", sample1), collapse="|"),")\\b") 创建一个正则表达式,就像捕获组内的所有元素一样,后跟一个单词边界。 \\b 是这里非常需要的一个。这样它就会进行精确的单词匹配。

    【讨论】:

    • 你能解释一下吗?
    • 我会使用 [.] 而不是 \\\\. 来删除特殊含义(恕我直言,在生成的正则表达式中更具可读性)
    • 旁注:我的完整 sample1 有 1199 个元素。运行正则表达式,出现错误,(Error in gsub(paste0("(", paste(sub("\\.", "\\\\.", sample1), collapse = "|"), : assertion 'tree-&gt;num_tags == num_tags' failed in executing regexp: file 'tre-compile.c', line 634) 所以我将sample1 拆分为两个向量; vector1 有 629 个元素,vector2 有剩余的 570 个。
    【解决方案2】:

    我们可以将paste 'sample1' 元素放在一起,将其用作gsub 中的pattern 参数,将其替换为''

    gsub(paste(sample1, collapse='|'), '', sample2)
    #[1] "try1"            "www.tryagain"    "255.255.255.255" "onemoretry"  
    

    或使用mgsub

    library(qdap)
    mgsub(sample1, '', sample2)
    #[1] "try1"            "www.tryagain"    "255.255.255.255" "onemoretry"     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2011-11-03
      • 1970-01-01
      相关资源
      最近更新 更多