【问题标题】:Is there a way to merge two dataframes with slightly different string values in columns in R?有没有办法合并 R 中列中字符串值略有不同的两个数据帧?
【发布时间】:2020-04-11 09:22:48
【问题描述】:

我正在处理一项 R 任务,其中包括使用 2 个单独的数据框。而且我需要将它们合并为一列(带有地名),其中的值有时会有所不同,例如:

“A Coruna”和“Coruna, A”、“Alicante/Alacant”和“Alicante”、“Santa Cruz de Tenerife”和“4 Santa Cruz”。

在合并数据框时,应将它们视为相同的值。 所以合并的结果将是一个像这样的数据框:

province | males.2018 | males.2013 | area

有什么方法可以做到这一点,而无需使用额外的库?

谢谢

【问题讨论】:

  • 你为什么不尝试为每个省添加一个带有西班牙邮政编码的列并使用它来合并。这样,您将始终保证正确完成
  • 请不要粘贴图像作为示例数据,请检查:stackoverflow.com/help/how-to-ask

标签: r dataframe statistics


【解决方案1】:

我不确定如何在没有任何外部包的情况下执行此操作,也许使用agrep

fuzzyjoin 包正是针对这种情况而开发的。那么为什么不利用它呢。但是,您想要匹配的值看起来并不相似,即使您说:“有时这些值会有点不同”。因此,fuzzyjoin 解决方案可能无法在此处为您提供帮助。从以下可以看出:

library(fuzzyjoin)

df1 <- data.frame(province1=c("A Coruna", "Alicante/Alacant", "Santa Cruz de Tenerife"))
df2 <- data.frame(province1=c("Coruna, A", "Alicante", "4 Santa Cruz"))

data.frame(df1, df2)
               province1  province1.1
1               A Coruna    Coruna, A
2       Alicante/Alacant     Alicante
3 Santa Cruz de Tenerife 4 Santa Cruz

以下合并尝试不返回匹配项:

merge(df1, df2, by = "province1")
# <0 rows> (or 0-length row.names)

现在尝试模糊匹配。用于连接的默认距离为 2。

stringdist_inner_join(df1, df2, by = "province1")
# A tibble: 0 x 2
# ... with 2 variables: province1.x <chr>, province1.y <fct>

这不会返回任何记录。所以尝试增加距离阈值。对于这个小例子,第一条记录需要 max.distance 为 5 才能被视为匹配。

stringdist_inner_join(df1, df2, by = "province1", max_dist = 5)
# A tibble: 1 x 2
  province1.x province1.y
  <chr>       <fct>      
1 A Coruna    Coruna, A

您必须进一步提高阈值才能获得更多匹配项。但是这样做会失败,因为“A Coruna”也匹配“Alicante”!

stringdist_inner_join(df1, df2, by = "province1", max_dist = 7)
# A tibble: 2 x 2
  province1.x province1.y
  <chr>       <fct>      
1 A Coruna    Coruna, A  
2 A Coruna    Alicante

将阈值提高到 8 得到“Alicante”,但仍匹配“A Coruna”。

stringdist_inner_join(df1, df2, by = "province1", max_dist = 8, distance_col = "dis")
# A tibble: 3 x 3
  province1.x      province1.y   dis
  <chr>            <fct>       <dbl>
1 A Coruna         Coruna, A       5
2 A Coruna         Alicante        7
3 Alicante/Alacant Alicante        8

所以您可以看到,这不适用于不太相似的值。在使用此方法之前,您可能需要进行一些数据清理。您可以尝试此功能中的各种方法。或者使用一些增加阈值的迭代方法,使已经匹配的记录不再匹配。

【讨论】:

    【解决方案2】:

    我认为最简单的方法是修复两个数据框中的省份名称:改用在新列中添加的ISO 3166-2:ES 代码。如果您将数据作为dput 的输出粘贴到问题中,我可以提供代码来执行此操作。

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多