Я не мог понять, как получить работающее решение, используя 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 и сталкивается с той же проблемой.