【问题标题】:Merging data frames with partial Matching using R使用 R 将数据帧与部分匹配合并
【发布时间】:2020-02-09 14:48:56
【问题描述】:

假设我有带有以下变量的数据框 df1

Continent   Country
1   Europe  Russia
2   Asia    Myanmar (Burma)
3   africa  Benin
4   africa  Botswana
5   africa  Burkina

和带有以下变量的 df2

Continent   Country
1   Europe  Russian Federation
2   Asia    Myanmar
3   africa  Benin,new
4   africa  Botswana
5   africa  Burkina

如何使用部分匹配将 2 个 df 按 Country 组合在一起

【问题讨论】:

标签: r


【解决方案1】:

您可以合并前五个字符。您需要安装stringr

复制您的数据

a<- data.frame( Continent=c("Europe","Asia","africa","africa","africa"), Country=c("Russia","Myanmar (Burma)","Benin","Botswana","Burkina"))
b <- data.frame( Continent=c("Europe","Asia","africa","africa","africa"), Country=c("Russian Federation","Myanmar","Benin,new","Botswana","Burkina"))

创建一个变量,前五个字母小写

 a$key <- stringr::str_extract(tolower(a$Country), "\\b[a-z]{0,5}")
 b$key <- stringr::str_extract(tolower(b$Country), "\\b[a-z]{0,5}")

然后在新键上合并(您可能希望在此合并之前重命名您的 cols

  merge( a , b , by="key")

【讨论】:

    【解决方案2】:

    了解最终/所需数据框的外观可能会有所帮助。

    您可以考虑使用fuzzyjoin 包来合并这两个数据框。一种方法是使用str_detect 并查看一个Country 字符串是否包含在另一个字符串中。

    library(tidyverse)
    library(fuzzyjoin)
    
    mf <- function(a, b) str_detect(a, b) | str_detect(b, a)
    
    fuzzy_semi_join(df1, df2, by = "Country", match_fun = mf)
    
      Continent         Country
    1    Europe          Russia
    2      Asia Myanmar (Burma)
    3    Africa           Benin
    4    Africa        Botswana
    5    Africa         Burkina
    

    内部连接将告诉您如何匹配行(保留两个 Country 列以供比较):

    fuzzy_inner_join(df1, df2, by = "Country", match_fun = mf)
    
      Continent.x       Country.x Continent.y          Country.y
    1      Europe          Russia      Europe Russian Federation
    2        Asia Myanmar (Burma)        Asia            Myanmar
    3      Africa           Benin      Africa          Benin,new
    4      Africa        Botswana      Africa           Botswana
    5      Africa         Burkina      Africa            Burkina
    

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 2020-10-15
      • 2013-10-18
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多