【问题标题】:How to extract matches from stringr::str_detect in R into a list vector如何从 R 中的 stringr::str_detect 中提取匹配项到列表向量中
【发布时间】:2021-07-06 01:03:19
【问题描述】:

我正在尝试对文本数据库执行以下搜索。

这里是示例数据库,df

df <- data.frame(

  id = c(1, 2, 3, 4, 5, 6), 
  name = c("john doe", "carol jones", "jimmy smith", 
           "jenny ruiz", "joey jones", "tim brown"), 
  place = c("reno nevada", "poland maine", "warsaw poland", 
           "trenton new jersey", "brooklyn new york", "atlanta georgia")

  )

我有一个字符串向量,其中包含我要查找的术语。

new_search <- c("poland", "jones")

我将向量传递给 str_detect 以在 df 中的任何列中查找 new_search 中的任何字符串,然后返回匹配的行...

df %>% 
    filter_all(any_vars(str_detect(., paste(new_search, collapse = "|")))) 

问题...如何将 str_detect 的结果提取到新列中?
对于返回的每一行......我想生成一个成功匹配的术语列表,并将它们放在一个列表或字符向量(matched_terms)中......像这样......

  id        name             place    matched_terms   
1  2 carol jones      poland maine   c("jones", "poland")
2  3 jimmy smith     warsaw poland   c("poland")
3  5  joey jones brooklyn new york   c("jones")


      

【问题讨论】:

    标签: r dplyr tidyverse stringr


    【解决方案1】:

    这是我幼稚的解决方案:

    new_search <- c("poland", "jones") %>% paste(collapse = "|")
    df %>% 
      mutate(new_var = str_extract_all(paste(name, place), new_search))
    

    【讨论】:

    • 非常简单有效
    • 是否可以在管道中使用 purrr::compact() 来过滤 df 仅针对 new_var 匹配的行?
    • 我不确定我是否理解你的问题。如果您想发布一个带有可重现示例的新问题,我很乐意试一试。
    【解决方案2】:

    您可以使用str_extract_all 提取多列中的所有模式,使用unite 将它们合并为一列。 unite 将该列合并为一个字符串,因此空值将转换为 "character(0)",我们使用 str_remove_all 将其删除,并仅保留那些具有任何匹配项的行。

    library(tidyverse)
    
    pat <- str_c(new_search, collapse = "|")
    
    df %>%
      mutate(across(-id, ~str_extract_all(., pat), .names = '{col}_new')) %>% 
      unite(matched_terms, ends_with('new'), sep = ',') %>%
      mutate(matched_terms = str_remove_all(matched_terms, 
                             'character\\(0\\),?|,character\\(0\\)')) %>%
      filter(matched_terms != '')
    
    #  id        name             place matched_terms
    #1  2 carol jones      poland maine  jones,poland
    #2  3 jimmy smith     warsaw poland        poland
    #3  5  joey jones brooklyn new york         jones
    

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      相关资源
      最近更新 更多