合并多个条件和最接近的数值匹配

时间:2018-12-04 14:07:16

标签: r merge data.table key

通过查看Stackoverflow和其他来源,我相信将我的数据帧更改为data.tables并使用setkey或类似的东西,将会得到我想要的。但是到目前为止,我还无法获得有效的语法。

我有两个数据帧,一个包含26000行,另一个包含6410行。

第一个数据帧包含以下列:

Customer name, Base_Code, Idenity_Number, Financials

第二个数据帧包含以下内容:

Customer name, Base_Code, Idenity_Number, Financials, Lapse

两组数据都具有相同的格式。

我的目标是将第二个数据框中的“失效”列连接到第一个数据框中。我遇到的问题是,财务数据中的数字值在两个数据集之间不匹配,我只希望DF1中最接近的匹配项能够使DF2中的“失效”列中的值与其相对应。

在某些示例中,每个数据帧中都有相同客户ID和基本代码的多个条目,因此我需要根据Idenity_Number和Base_Code(准确)合并两者,然后与最接近的财务数字匹配进行匹配仅适用于每个条目。

DF2中的每个客户和Base_Code都将再没有其他条目。

以下是DF1的示例:

DF1

以下是DF2的示例:

DF2

最后,这就是我想要的结果:

Desired Outcome

如果以杰西卡·兔子(Jessica Rabbit)为例,我们与DF1和DF2匹配,则DF1中的财务价值1240与DF2中的1058匹配,因为这是最接近的匹配。

1 个答案:

答案 0 :(得分:0)

我不知道如何使用data.table获得有效的解决方案,因此我重新考虑了方法并提出了解决方案。

首先,我合并了两个数据集,然后删除了没有拉长“ LAP”字样的所有条目,这为我提供了所有非失效条目:

NON_LAP <- merge(x=Merged,y=LapsesMonth,by=c("POLICY_NO","LOB_BASE"),all.x=TRUE)

NON_LAP <- NON_LAP [!grepl("LAP", NON_LAP$Status, ignore.case=FALSE),]

接下来,我再次合并,这一次专门查找已失效的案例。为了确定哪个是最接近的匹配项,我使用了abs函数,然后我按最小的差异进行排序以按顺序获取最接近的匹配项。最后,我删除了重复项以显示最接近的匹配项,然后还保留了重复项并去除了“ LAP”状态,以确保那些不是最接近的匹配项保留在数据中。

最后,我将它们合并在一起,给了我所需的结果。

FIND_LAP  <- merge(x=Merged,y=LapsesMonth,by=c("POLICY_NO","LOB_BASE"),all.y=FALSE)

FIND_LAP$Difference <- abs(FIND_LAP$GWP - FIND_LAP$ACTUAL_PRICE)

FIND_LAP  <- FIND_LAP[order( FIND_LAP[,27] ),]

FOUND_LAP <- FIND_LAP [!duplicated(FIND_LAP[c("POLICY_NO","LOB_BASE")]),]

NOT_LAP <- FIND_LAP [duplicated(FIND_LAP[c("POLICY_NO","LOB_BASE")]),]

希望这会帮助可能对R陌生并遇到相同问题的其他人。