我在 R 工作
我的数据有 500,000 行,但这里使用了一个小例子。
我有一些学校工作人员的数据。有些人在一所学校工作,有些人在两所学校工作,有些人在三所学校等。他们工作的每个学校都是一行数据。
学校并不总是为个人记录相同的名字。例如,一所学校记录为威尔,另一所学校记录为威廉。
我也有这样的假设:对于在不止一所学校工作的个人,他们的名字和出生日期在每所学校总是记录相同的。
基于他们名字的相似性,我想要一种方法来识别可能是同一个人的人,然后为他们分配一个id。
会有某种切断,例如格雷格和格里芬很可能不是同一个人,即使他们共享相同的前两个字母。
样本数据:
data_current <- data.frame(first_name = c("will", "william", "william", "laura", "jessica", "jessicalouise", "james", "greg", "griffin"),
last_name = c("smith", "smith", "smith", "maxwell", "maxwell", "maxwell", "lead", "jones", "jones"),
date_of_birth = c("2000-01-02","2000-01-02", "2000-01-02", "2007-01-02","2007-01-02","2007-01-02","1999-01-02","2004-01-02","2004-01-02"),
school_id = c(1, 2, 3, 4, 5, 6, 7, 8, 9))
名 | 第二个名字 | 出生日期 | 学校ID |
---|---|---|---|
将要 | 史密斯 | 2000-01-02 | 1 |
威廉 | 史密斯 | 2000-01-02 | 2 |
威廉 | 史密斯 | 2000-01-02 | 3 |
劳拉 | 麦克斯韦 | 2007-01-02 | 4 |
杰西卡 | 麦克斯韦 | 2007-01-02 | 5 |
杰西卡路易丝 | 麦克斯韦 | 2007-01-02 | 6 |
詹姆士 | 带领 | 1999-01-02 | 7 |
格雷格 | 琼斯 | 2004-01-02 | 8 |
格里芬 | 琼斯 | 2004-01-02 | 9 |
所需数据:
很可能前三个人是同一个人,因此分配了相同的 person_id,依此类推......
data_desired <- data.frame(first_name = c("will", "william", "william", "laura", "jessica", "jessicalouise", "james", "greg", "griffin"),
last_name = c("smith", "smith", "smith", "maxwell", "maxwell", "maxwell", "lead", "jones", "jones"),
date_of_birth = c("2000-01-02","2000-01-02", "2000-01-02", "2007-01-02","2007-01-02","2007-01-02","1999-01-02","2004-01-02","2004-01-02"),
school_id = c(1, 2, 3, 4, 5, 6, 7, 8, 9),
person_id = c(1, 1, 1, 2, 3, 3, 4, 5, 6))
名 | 第二个名字 | 出生日期 | 学校ID | 人物ID |
---|---|---|---|---|
将要 | 史密斯 | 2000-01-02 | 1 | 1 |
威廉 | 史密斯 | 2000-01-02 | 2 | 1 |
威廉 | 史密斯 | 2000-01-02 | 3 | 1 |
劳拉 | 麦克斯韦 | 2007-01-02 | 4 | 2 |
杰西卡 | 麦克斯韦 | 2007-01-02 | 5 | 3 |
杰西卡路易丝 | 麦克斯韦 | 2007-01-02 | 6 | 3 |
詹姆士 | 带领 | 1999-01-02 | 7 | 4 |
格雷格 | 琼斯 | 2004-01-02 | 8 | 5 |
格里芬 | 琼斯 | 2004-01-02 | 9 | 6 |
有人对如何解决这个问题有建议吗?
这是使用字符串相似性的一种可能性。它在您的示例中效果很好,因为您的数据完全分离。但是,超过 500K 行时您可能会遇到一些问题,但它可以帮助您入门:
输出
怎么运行的
正如评论中提到的,对于具有相似二元组但不相同的名称来说,这可能会很棘手。这些情况将很难区分。此外,这只是一个词汇比较,这对于缩写名称也不太可能有效。例如,“Bob”是“Robert”的缩写,“Dick”是“Richard”的缩写。
您还可以考虑使用其他字符串相似性度量。例如,您可以指定 Jaro-Winkler 相似度 (
method = 'jw'
) 和权重 (p = 0.10
)。这将对开头相同的名字进行加权(“will”与“william”),从而导致更高的相似度分数和潜在的分离。