【问题标题】:How can I filter a vector based on regex list in R?如何根据 R 中的正则表达式列表过滤向量?
【发布时间】:2023-02-11 15:45:07
【问题描述】:

我有一个字符串向量,我想根据第二个向量中的关键字对其进行过滤。

下面是一个小代表:

list1 <- c("I like apples", "I eat bread", "Bananas are my favorite")
fruit <- c("apple","banana")

我假设我将需要使用stringr/stringi,但本质上,我想按照list1 %in% fruit的方式做一些事情,它会返回T,F,T

有什么建议么?

【问题讨论】:

    标签: r stringr


    【解决方案1】:

    str_dectect 的解决方案:

    library(tidyverse)
    data.frame(list1) %>%
      mutate(Flag = str_detect(list1, paste0("(?i)", paste0(fruit, collapse = "|"))))
                        list1  Flag
    1           I like apples  TRUE
    2             I eat bread FALSE
    3 Bananas are my favorite  TRUE
    

    如果你想filter(即子集)你的数据:

    data.frame(list1) %>%
      filter(str_detect(list1, paste0("(?i)", paste0(fruit, collapse = "|"))))
                        list1
    1           I like apples
    2 Bananas are my favorite
    

    请注意,(?i) 用于使匹配不区分大小写。

    编辑:

    要在单独的列中记录匹配项,您可以使用str_extract(如果您希望每个字符串只有一个匹配项)或str_extract_all(对于多个匹配项):

    data.frame(list1) %>%
      mutate(Flag = str_detect(list1, paste0("(?i)", paste0(fruit, collapse = "|"))),
             Match = str_extract_all(list1, paste0("(?i)", paste0(fruit, collapse = "|"))))
                        list1  Flag  Match
    1           I like apples  TRUE  apple
    2             I eat bread FALSE       
    3 Bananas are my favorite  TRUE Banana
    

    【讨论】:

    • 谢谢!这很棒,而且效果很好。以此为基础,Flag 列是否可以显示它在列表中选择的单词?
    【解决方案2】:

    我们可以使用 grepl 来做到这一点,而无需使用外部包。

    grepl可以处理由|分隔的多个模式,因此我们可以先将fruit中的字符串与|作为分隔符连接在一起。

    如果您不关心大小写,请记住设置ignore.case = TRUE(请注意示例中的“香蕉”有不同的大小写)。

    grepl(paste(fruit, collapse = "|"), list1, ignore.case = T)
    [1]  TRUE FALSE  TRUE
    

    或者使用grep直接输出匹配的字符串:

    # same as list1[grepl(paste(fruit, collapse = "|"), list1, ignore.case = T)]
    grep(paste(fruit, collapse = "|"), list1, ignore.case = T, value = T)
    [1] "I like apples"           "Bananas are my favorite"
    

    【讨论】:

    • 谢谢!这真的很有帮助并且解释得很好!
    猜你喜欢
    • 2019-11-01
    • 2021-06-15
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多