首页 > 解决方案 > 如何使用 R 中的姓名、性别、种族和粗略估计的年龄跨大型数据集进行匹配

问题描述

我有 2 个数据集,每个数据集大约 20k 行。

df 1 包含以下信息

名字 | 姓氏 | 种族 | 性别 | 出生年份| 唯一身份

df2 包含以下内容

名字 | 姓氏 | 种族 | 性别 | 年龄

我想加入数据集,以便为 DF 2 中的每一行相关行获得一个唯一 ID。问题是由于这些数据是纵向的,因此有些人在 df2 中多次使用并且有多个年龄。例如

John | smith | white | male | 29
John | smith | white | male | 30

而 df1 包含以下内容

John | smith | white | male | 1991 | 74b23

最终我希望数据看起来像这样


John | smith | white | male | 29 | 74b23
John | smith | white | male | 30 | 74b23

有没有办法返回名字,姓氏,种族和性别的完全匹配,但年龄匹配或需要一年?

谢谢!

标签: rleft-joinmatchingfuzzyjoin

解决方案


library(data.table)

df1 <- data.table(f.name = "John",
                      l.name = "Smith",
                      race = "white",
                      gender = "male",
                      b.year = 1991,
                      ID = "74b23")    

df2 <- data.table(f.name = "John",
                      l.name = "Smith",
                      race = "white",
                      gender = "male",
                      age = c(29, 30))

df1[, age := year(Sys.Date())-b.year]

setkeyv(df1, c("f.name", "l.name", "race", "gender", "age"))
setkeyv(df2, c("f.name", "l.name", "race", "gender", "age"))
df3 <- df1[df2, roll = "nearest"]

“roll”值使用 setkeyv 中提供的最后一列,在本例中为年龄。

> df3
   f.name l.name  race gender b.year    ID age
1:   John  Smith white   male   1991 74b23  29
2:   John  Smith white   male   1991 74b23  30

推荐阅读