Объединить с несколькими условиями и ближайшим числовым соответствием - PullRequest
0 голосов
/ 04 декабря 2018

Просматривая Stackoverflow и другие источники, я считаю, что изменение моих фреймов данных на data.tables и использование setkey или аналогичного мне даст то, что я хочу.Но пока мне не удалось получить рабочий синтаксис.

У меня есть два фрейма данных, один из которых содержит 26000 строк, а другой - 6410 строк.

Первый фрейм данных содержит следующие столбцы:

Customer name, Base_Code, Idenity_Number, Financials

Второй кадр данных содержит следующее:

Customer name, Base_Code, Idenity_Number, Financials, Lapse

Оба набора данных имеют идентичное форматирование.

Моя цель - присоединить столбец «Промежуток» во втором кадре данных к первому.У меня проблема в том, что числовое значение в Financials не совпадает между двумя наборами данных, и я хочу, чтобы только самое близкое совпадение в DF1 имело значение в столбце Lapse в DF2 против него.

Будут примерыгде есть несколько записей для одного и того же идентификатора клиента и базового кода в каждом кадре данных, поэтому мне нужно объединить две записи на основе Idenity_Number и Base_Code (что точно), а затем сопоставить с ближайшим финансовым числовым соответствием только для каждой записи.

Никогда не будет больше записей в DF2, чем в DF1 для каждого клиента и Base_Code.

Вот пример DF1:

DF1

Вот пример DF2:

DF2

И, наконец, вот что я хочу закончить:

Desired Outcome

Если мы используем в качестве примера Jessica Rabbit, у нас есть совпадение с DF1 и DF2, финансовое значение 1240 из DF1 сопоставляется с 1058 в DF2, так какбыл спроигрышный матч.

1 Ответ

0 голосов
/ 12 декабря 2018

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

...