-1

我正在寻找一种基于参与者全名的部分匹配来合并两个数据文件的方法,这些全名有时以不同的格式输入,有时拼写错误。我知道部分匹配(例如 agrep 和 pmatch)和合并数据文件有一些不同的功能选项,但我需要帮助 a) 将两者结合起来;b) 进行可以忽略中间名的部分匹配;c) 在合并的数据文件中存储原始名称格式和 d) 保留唯一值,即使它们没有匹配项。

例如,我有以下两个数据文件:

文件名称:员工资料

全名 开始日期 订单 ANGELA MUIR 6/15/14 25 EILEEN COWIE 6/15/14 44 LAURA CUMMING 10/6/14 43 ELENA POPA 1/21/15 37 KAREN MACEWAN 3/15/99 39

文件名称:评估数据

候选人主导因素 SI-D SI-I Angie muir I -3 12 Caroline Burn S -5 -3 Eileen Mary Cowie S -5 5 Elena Pope C -4 7 Henry LeFeuvre C -5 -1 Jennifer Ford S -3 -2 Karen麦克尤恩一世 -4 10 劳拉·卡明 S 0 6 曼迪普·乔哈尔 C -2 2 穆巴拉克·侯赛因 D 6 -1

我想根据名称(df1 中的全名和 df2 中的候选人)合并它们,忽略中间名(例如 Eilen Cowie = Eileen Mary Cowie)、额外空格(Laura Cumming = Laura Cumming);拼写错误(例如 Elena Popa = Elena Pope)等。

理想的输出如下所示:

姓名 全名 候选人 开始日期 订单 主导因素 SI-D SI-I ANGELA MUIR ANGELA MUIR Angie muir 6/15/14 25 I -3 12 Caroline Burn N/A Caroline Burn N/AN/AS -5 -3 EILEEN COWIE EILEEN COWIE Eileen Mary Cowie 6/15/14 44 S -5 5 ELENA POPA ELENA POPA Elena Pope 1/21/15 37 C -4 7 Henry LeFeuvre N/A Henry LeFeuvre N/AN/AC -5 -1 Jennifer Ford N/ A Jennifer Ford N/AN/AS -3 -2 KAREN MACEWAN KAREN MACEWAN Karen McEwan 3/15/99 39 I -4 10 LAURA CUMMING LAURA CUMMING Laura Cumming 10/6/14 43 S 0 6 Mandip Johal N/A Mandip Johal N/AN/AC -2 2 穆巴拉克·侯赛因 N/A 穆巴拉克·侯赛因 N/AN/AD 6 -1

任何建议将不胜感激!

4

1 回答 1

0

这是一个可能有帮助的过程。您必须检查结果并根据需要进行调整。

df1

#            v1      v2
#1  ANGELA MUIR 6/15/14
#2 EILEEN COWIE 6/15/14
#3 AnGela Smith  5/3/14

df2

#                 u1   u2
#1 Eileen Mary Cowie  I-3
#2        Angie muir -5 5

index <- sapply(df1$v1, function(x) {
  agrep(x, df2$u1, ignore.case=TRUE, max.distance = .5)
}
)
index <- unlist(index)
df2$u1[index] <- names(index)
merge(df1, df2, by.x='v1', by.y='u1')

#            v1      v2   u2
#1  ANGELA MUIR 6/15/14 -5 5
#2 EILEEN COWIE 6/15/14  I-3

我不得不调整函数max.distance中的参数index。它可能不适用于您的数据,但可以调整并测试它是否有效。如果这没有帮助,有一个名为的包stringdist可能具有更强大的匹配功能amatch

数据

v1 <- c('ANGELA MUIR', 'EILEEN COWIE', 'AnGela Smith')
v2 <- c('6/15/14', '6/15/14', '5/3/14')
u1 <- c('Eileen Mary Cowie', 'Angie muir')
u2 <- c('I-3', '-5 5')
df1 <- data.frame(v1, v2, stringsAsFactors=F)
df2 <- data.frame(u1, u2, stringsAsFactors = F)
于 2015-06-02T00:01:37.043 回答