首页 > 解决方案 > 如何合并相似但不相同的行?

问题描述

我有一个大型数据集(1 000 000+ 行),其中包含有关客户的数据,即电子邮件地址、全名、国家/地区、邮政编码、街道名称、街道号码。我们想对客户行为进行一些分析,其中至关重要的是我们知道哪些客户是回头客,哪些客户是新客户。

目前,我们仅使用电子邮件地址来识别唯一客户,但我们发现许多人使用多个电子邮件地址在我们公司下订单。因此,我们希望使用其他客户数据来尝试识别使用不同电子邮件地址购买的客户。我们在这里遇到的问题是,有些人将他们的街道名称写成 Baker St.,第二次写成 Baker Street,或者像 BakerStreet,或者 BakerSt。

所以,我想做的是:查看数据集中的电子邮件地址。为客户提供相同的电子邮件地址。如果没有相同的电子邮件地址,请查看全名 + 地址。如果这些足够可比,那么客户就是同一个客户,所以给他们相同的 ID。如果没有,请给他们一个新的客户 ID。

我试图做的是像这样连接:全名|国家|邮政编码|街道名称|街道号码,然后计算整个数据集的 Levenshtein 距离,但由于它是一个大数据集,它需要的时间太长(每个客户大约 1 - 2 秒)。解决方案必须比这更快。

例如,我正在寻找的是:

示例 DF:

df <- data.frame(
name = c("Andrew Slang","Matthew Willemson","Peter Johnson","AndrewwSlang","Peter Johnson","PetterJohnson"), 
email = c("a.slang@gmail.com","matthew@gmail.com","peterjohnson@gmail.com","andrewslang@hotmail.com","peterjohnson@gmail.com","p.johnson@hotmail.com"),
country = c("UK","UK","UK","UK","UK","UK"),
zip = c("1234AB","1235AB","1236AB","1234AB","1236AB","1236AB"),
housenr = c("13","4","52","13","52","52"))

基于 X 重叠量(例如 90% 重叠)添加具有新客户 ID 的列的示例答案:

df_after <- data.frame(name = c("Andrew Slang","Matthew Willemson","Peter Johnson","AndrewwSlang","Peter Johnson","PetterJohnson"),
                       email = c("a.slang@gmail.com","matthew@gmail.com","peterjohnson@gmail.com","andrewslang@hotmail.com","peterjohnson@gmail.com","p.johnson@hotmail.com"),
                       country = c("UK","UK","UK","UK","UK","UK"),
                       zip = c("1234AB","1235AB","1236AB","1234AB","1236AB","1236AB"),
                       housenr = c("13","4","52","13","52","52"),
                       customerID = c("1","2","3","1","3","3"))

这里添加了customerID,第一行和第四行赋予相同的ID,第三、第五和第六行。

标签: rdatabasedata-analysisdata-cleaninglevenshtein-distance

解决方案


推荐阅读