【问题标题】:Detect in list2 if there are any strings (whole or part of bigger string) that is contained in list1在 list2 中检测 list1 中是否包含任何字符串(整个或部分较大的字符串)
【发布时间】:2019-10-04 01:57:21
【问题描述】:

我有两个列表:

list1<-list("q","w","e","r","t")
list2<-list("a","a","aq","c","f","g")

我需要一个可以提供TRUE 的代码,因为qlist2 的第三个单元格中。我需要在list2 中搜索list1 的每个单元格。我的意思是我需要在list2 的每个单元格中搜索list1 的每个单元格中包含的任何字符串。匹配应该针对整个匹配,也应该针对部分匹配(如果来自list1 的字符串是list2 中较大字符串的一部分)并且在这两种情况下我都需要接收TRUE

【问题讨论】:

  • 请添加预期输出
  • 是的,不清楚您是否需要列表输出或单个 TRUE/FALSE
  • @PoGibas "我需要一个可以提供TRUE 的代码" 所以我需要得到TRUEFALSE
  • lapply(list1, grepl, list2)
  • @CalumYou Single TRUEFALSE

标签: r text pattern-matching match matching


【解决方案1】:
any(sapply(list1, grepl, list2))
# [1] TRUE

或者等价

greplv <- Vectorize(grepl, 'pattern')
any(greplv(list1, list2))
# [1] TRUE

【讨论】:

    【解决方案2】:

    不确定在这种情况下列表输入是否特别重要。这是一种避免使用任何迭代函数(如apply)的方法。我们可以将输入列表折叠成一个正则表达式模式,然后用它检查整个第二个列表。如果您在 list1 中有任何特殊字符,您可能需要小心,尽管对于任何字符串匹配方法都是如此。

    library(stringr)
    list1 <- list("q", "w", "e", "r", "t")
    list2 <- list("a", "a", "aq", "c", "f", "g")
    
    pat <- unlist(list1) %>% str_c(collapse = "|")
    
    list2 %>%
      unlist %>%
      str_detect(pat) %>%
      any
    #> [1] TRUE
    

    reprex package (v0.2.1) 于 2019-05-16 创建

    【讨论】:

    • 您确定需要library(stringr) 吗?我找不到要安装的库,而且似乎没有它代码也可以工作。
    • 感谢您的回答。问题是我需要匹配 list1 中的 whole 单元格以匹配 list2 单元格的 wholepart。您的代码将 list1 中的 whole 单元格或 part 单元格匹配到 list2 的 whole 或部分单元格。 stackoverflow.com/a/56174663/1601703 答案确实符合我的需要。但我认为问题不在于您的代码,而在于我对问题的表述不是很准确。
    • 据我所知,这个答案应该总是给出与我相同的输出。要对此进行测试,请将list1 的第一个元素更改为"dq"。然后list1中的一个元素的一部分匹配list2中的一个元素的一部分,但输出是(正确)FALSE
    • @IceCreamToucan 你是对的。 Clum 你很抱歉造成混乱。
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2020-01-09
    • 2020-08-21
    • 2019-08-05
    • 1970-01-01
    • 2019-03-13
    • 2012-02-18
    • 2015-09-08
    相关资源
    最近更新 更多