【问题标题】:grepl on two vectors element by elementgrepl 逐个元素地处理两个向量
【发布时间】:2019-05-19 05:14:40
【问题描述】:

我想在两个向量上应用grepl,以查看第一个向量的元素是否在第二个向量的对应元素中可用。例如

grepl(c("bc","23","a2"),c("abcd","1234","zzzz"))

由于bcabcd 中,231234 中,而a2 不在zzzz 中,我想得到TRUE TRUE FALSE。但是,我得到的却是:

[1]  TRUE FALSE FALSE
Warning message:
In grepl(c("bc", "23", "a2"), c("abcd", "1234", "zzzz")) :
argument 'pattern' has length > 1 and only the first element will be used 

【问题讨论】:

    标签: r grepl


    【解决方案1】:

    我们可以在这里尝试使用mapply

    fun <- function(x, y) {
        grepl(x, y)
    }
    
    mapply(fun, c("bc","23","a2"), c("abcd","1234","zzzz"))
    
      bc    23    a2 
    TRUE  TRUE FALSE 
    

    【讨论】:

    • 无需事先定义函数mapply(grepl, c("bc","23","a2"), c("abcd","1234","zzzz")) 也一样
    【解决方案2】:

    stringr 包(依赖于stringi)提供自然矢量化的regex 函数:

    require(stringr)
    str_detect(string=c("abcd","1234","zzzz"),pattern=c("bc","23","a2"))
    #[1]  TRUE  TRUE FALSE
    

    请注意,对于grep,参数的顺序是不同的。

    【讨论】:

    • 或者你可以只使用原始包(我认为这里不需要正则表达式)stringi::stri_detect_fixed(c("abcd","1234","zzzz"), c("bc","23","a2"))
    【解决方案3】:

    我们也可以使用purrr:

    purrr::map2(c("bc","23","a2"),c("abcd","1234","zzzz"),
                function(x,y) grepl(x,y))
    [[1]]
    [1] TRUE
    
    [[2]]
    [1] TRUE
    
    [[3]]
    [1] FALSE
    

    如果你想留在base

       unlist(Map(function(x,y) grepl(x,y), my_list[[1]],my_list[[2]]))
       bc    23    a2 
     TRUE  TRUE FALSE 
    

    【讨论】:

      【解决方案4】:

      试试 or 运算符

      grepl(c("bc|23|a2"),c("abcd","1234","zzzz"))
      

      【讨论】:

      • 这允许左边的任何东西匹配右边的任何元素。 OP专门要求比较相应的元素,所以这个答案是错误的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      相关资源
      最近更新 更多