【问题标题】:How to detect names from a dataframe that are included totally or partially in names from another dataframe?如何检测数据框中的名称完全或部分包含在另一个数据框中的名称中?
【发布时间】:2022-01-25 00:37:57
【问题描述】:

我想从 df1 中检测全部或部分包含在 df2 中的城市名称中的城市 1 的全部名称(即,将城市视为字符串),以便常见字符显示在新的列“匹配”,理想情况下使用 dplyr 和 stringr。

city1 <- c("boston", "cambridge", "houston")
df1 <- as.data.frame(city1)
df1

city2 <- c("atlanta", "denver", "cambridge", "cambridgeuk", "london", "york")
df2 <- as.data.frame(city2)
df2

我想要什么(注意 cambridge 和 cambridgeuk 的区别):

  city1     city2       match    
  <chr>     <chr>       <chr>    
1 boston    atlanta     NA       
2 cambridge denver      NA       
3 houston   cambridge   cambridge
4 NA        cambridgeuk cambridge
5 NA        london      NA       
6 NA        york        NA

感谢您的帮助

【问题讨论】:

    标签: dataframe dplyr matching stringr


    【解决方案1】:

    如果匹配是唯一的,我们可以尝试:

    library(tidyverse)
    
    cities1 <- df1$city1 %>%
     str_c(collapse = '|')
    df2 %>%
     mutate(match = str_extract(city2, cities1))
    #>         city2     match
    #> 1     atlanta      <NA>
    #> 2      denver      <NA>
    #> 3   cambridge cambridge
    #> 4 cambridgeuk cambridge
    #> 5      london      <NA>
    #> 6        york      <NA>
    

    但是假设我们在df2$city2 内部有cambridgehouston,那么它就有点复杂了。 我确信有更明确的方法可以做到这一点,但这可以工作。

    library(tidyverse)
    
    city1 <- c("boston", "cambridge", "houston")
    df1 <- as.data.frame(city1)
    df1
    #>       city1
    #> 1    boston
    #> 2 cambridge
    #> 3   houston
    
    city2 <- c("atlanta", "denver", "cambridgehouston", "cambridgeuk", "london", "york")
    df2 <- as.data.frame(city2)
    df2
    #>              city2
    #> 1          atlanta
    #> 2           denver
    #> 3 cambridgehouston
    #> 4      cambridgeuk
    #> 5           london
    #> 6             york
    
    
    result_match <-
      map_dfc(df1$city1, ~
      tibble(!!.x := str_extract(df2$city2, .) %>% replace_na(""))) %>%
      rowwise() %>%
      transmute(match = c_across(all_of(df1$city1)) %>% str_c(collapse = " ") %>%
        str_trim() %>%
        na_if(""))
    
    bind_cols(df2, result_match)
    #>              city2             match
    #> 1          atlanta              <NA>
    #> 2           denver              <NA>
    #> 3 cambridgehouston cambridge houston
    #> 4      cambridgeuk         cambridge
    #> 5           london              <NA>
    #> 6             york              <NA>
    

    reprex package (v2.0.1) 于 2021 年 12 月 24 日创建

    【讨论】:

    • 非常感谢 jpdugo17 !一个非常聪明的代码,它完全回答了我的问题,+1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多