【问题标题】:String matching using stringdist使用 stringdist 进行字符串匹配
【发布时间】:2021-07-26 14:21:03
【问题描述】:

我有两个部门名称类似于这些的数据框:

d1 <- data.frame(depto=c("antioquia", "arauca", "arauca", "cauca", "popayan cauca", "guayabal cundinamarca", "cundinamarca", "cundinamarca", "fresno - tolima", "tolima", "santander", "norte santander"))
d2 <- data.frame(depto=c("Antioquia", "Arauca", "Cauca", "Cundinamarca", "Vichada", "Tolima", "Norte de Santander", "Valle del Cauca", "Santander"), id=c(1,2,3,4,5,6,7,8,9))

变量“depto”应该是相同的,但有一些不同。我尝试使用 stringdist 来匹配两个数据框。

stringdist_left_join(d1, d2,  by ="depto",  distance_col = NULL)

结果如下:

1              antioquia    Antioquia  1
2                 arauca       Arauca  2
3                 arauca        Cauca  3
4                 arauca       Arauca  2
5                 arauca        Cauca  3
6                  cauca       Arauca  2
7                  cauca        Cauca  3
8          popayan cauca         <NA> NA
9  guayabal cundinamarca         <NA> NA
10          cundinamarca Cundinamarca  4
11          cundinamarca Cundinamarca  4
12       fresno - tolima         <NA> NA
13                tolima       Tolima  6
14             santander    Santander  9
15       norte santander         <NA> NA

我想知道一种改进方法。第一个问题是 Cauca 和 Arauca 的部门总是匹配为相同的。第二个问题是 d1 中的某些部门包括直辖市(例如“guayabal cundinamarca”)但我希望匹配方法知道是否有一些额外的单词但部门名称也包含在要匹配的字符串中它(在这种情况下与昆迪纳马卡)。第三个问题是一些部门名称有相同的单词但不同(例如 Norte de Santander 和 Santander),有时不匹配。谢谢

【问题讨论】:

    标签: r match stringdist


    【解决方案1】:

    如果depto 列通常是可靠的(即您在数据输入方面没有大问题,例如拼写错误),您可以使用fuzzyjoin 包中的regex_left_join:

    library(fuzzyjoin)
    d1 <- data.frame(depto=c("antioquia", "arauca", "arauca", "cauca", "popayan cauca", "guayabal cundinamarca", "cundinamarca", "cundinamarca", "fresno - tolima", "tolima", "santander", "norte santander"))
    d2 <- data.frame(depto=c("Antioquia", "Arauca", "Cauca", "Cundinamarca", "Vichada", "Tolima", "Norte de Santander", "Valle del Cauca", "Santander"), id=c(1,2,3,4,5,6,7,8,9))
    fuzzyjoin::regex_left_join(d1, d2,  by ="depto", ignore_case = TRUE)
    

    输出:

                     depto.x      depto.y id
    1              antioquia    Antioquia  1
    2                 arauca       Arauca  2
    3                 arauca       Arauca  2
    4                  cauca        Cauca  3
    5          popayan cauca        Cauca  3
    6  guayabal cundinamarca Cundinamarca  4
    7           cundinamarca Cundinamarca  4
    8           cundinamarca Cundinamarca  4
    9        fresno - tolima       Tolima  6
    10                tolima       Tolima  6
    11             santander    Santander  9
    12       norte santander    Santander  9
    

    【讨论】:

    • 谢谢,这是一个很好的解决方案。唯一的问题是与 Santander 相匹配的 Norte de Satander。
    • 我认为很难找到一种足够聪明的方法来匹配guayabal cundinamarca 和Cundinamarca,而不是norte santander 和Santander。您可以尝试通过使用不同的方法和相似性阈值来调整stringdist 方法,但这对于新数据/未知值可能并不可靠。我能想到的唯一其他选择是在出现这些值时创建一些确定性规则。
    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2020-10-16
    • 2018-10-13
    • 2013-09-08
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多