Скользящее соединение с идентификатором группы в обеих таблицах - PullRequest
2 голосов
/ 28 апреля 2020

У нас есть два кадра данных: первый с датами эфирной рекламы для набора продуктов и второй с датами продаж для одного и того же набора продуктов.
Мы хотели бы прикрепить для каждого объявления каждого продукта, ближайшая продажа, ПОСЛЕ объявления.

Вот код для входных данных:

original_table = data.table(article = c('A','A','A','B','B','B','B'), 
                            date_ad = as.Date(c('2010-04-09','2011-07-12','2012-05-22','2011-07-12','2014-02-02','2015-04-13','2016-08-12'),))

> original_table
   article    date_ad
1:       A 2010-04-09
2:       A 2011-07-12
3:       A 2012-05-22
4:       B 2011-07-12
5:       B 2014-02-02
6:       B 2015-04-13
7:       B 2016-08-12

table_to_join = data.table(article = c('A','A','B','B','B'), 
                           date_sale = as.Date(c('2010-12-15','2012-08-20','2013-12-01','2016-01-05','2017-01-20'),))

> table_to_join
   article  date_sale
1:       A 2010-12-15
2:       A 2012-08-20
3:       B 2013-12-01
4:       B 2016-01-05
5:       B 2017-01-20

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

> result
   article    date_ad  date_sale
1:       A 2010-04-09 2010-12-15
2:       A 2011-07-12 2012-08-20
3:       A 2012-05-22 2012-08-20
4:       B 2011-07-12 2013-12-01
5:       B 2014-02-02 2016-01-05
6:       B 2015-04-13 2016-01-05
7:       B 2016-08-12 2017-01-20

PS: original_table может содержать намного больше строк, чем table_to_join для каждой статьи. Несколько строк в original_table могут быть связаны с одной строкой из table_to_join.

Как мы можем получить это эффективным способом?

1 Ответ

2 голосов
/ 28 апреля 2020

Мы можем использовать скользящее соединение с data.table

library(data.table)
table_to_join[, date_ad := date_sale][original_table, 
       on = .(article, date_sale = date_ad), roll = -Inf]
#   article  date_sale    date_ad
#1:       A 2010-04-09 2010-12-15
#2:       A 2011-07-12 2012-08-20
#3:       B 2015-04-13 2016-01-05
#4:       B 2016-08-12 2017-01-20

Я думаю, что OP путали с именами выходных столбцов. Использование обновления по ссылке должно быть понятнее:

table_to_join[, date_ad := date_sale]
original_table[, date_sale :=
    table_to_join[.SD, on=.(article, date_ad), roll=-Inf, x.date_sale]
]

Вывод:

   article  date_sale    date_ad
1:       A 2010-04-09 2010-12-15
2:       A 2011-07-12 2012-08-20
3:       A 2012-05-22 2012-08-20
4:       B 2011-07-12 2013-12-01
5:       B 2014-02-02 2016-01-05
6:       B 2015-04-13 2016-01-05
7:       B 2016-08-12 2017-01-20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...