Скользящее соединение с использованием data.table с ограничением в R - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь объединить две таблицы данных, используя скользящее соединение. Я посмотрел на различные ответы, включая здесь , но, к сожалению, не смог найти тот, который помогает в этом случае. Я заимствую тот же пример из размещенной ссылки.

мой первый набор данных - это данные веб-сессии для двух пользователей 1 и 2:

user  web_date_time
1   29-Oct-2016 6:10:03 PM
1   29-Oct-2016 7:34:17 PM
1   30-Oct-2016 2:08:03 PM
1   30-Oct-2016 3:55:12 PM
2   31-Oct-2016 11:32:12 AM
2   31-Oct-2016 2:59:56 PM
2   01-Nov-2016 12:49:44 PM

Моя вторая отметка времени для покупки:

user  purchase_date_time
    1   29-Oct-2016 6:10:00 PM
    1   29-Oct-2016 6:11:00 PM
    2   31-Oct-2016 11:35:12 AM
    2   31-Oct-2016 2:50:00 PM

Мой желаемый вывод - какой веб-сеанс привел к покупке, но с ограничением. Ограничение - веб-сессия должна быть после предыдущей покупки. Желаемый результат выглядит следующим образом (требуется для всех покупок дополнительный столбец «websession_led_purchase»):

user  purchase_date_time          websession_led_purchase
    1   29-Oct-2016 6:10:00 PM    NA
    1   29-Oct-2016 6:11:00 PM    29-Oct-2016 6:10:03 PM
    2   31-Oct-2016 11:35:12 AM   31-Oct-2016 11:32:12 AM
    2   31-Oct-2016 2:50:00 PM    NA

Первый NA не отвечает за веб-сессию до этой покупки, второй NA - за отсутствие веб-сессий после предыдущей покупки (и до покупки), которая привела ко второй покупке для пользователя 2.

Я попытался использовать метод roll join dt2 [dt1, roll = Inf], однако я получаю «31-Oct-2016 11:32:12 AM» для четвертой строки в желаемом выводе, что неверно.

Дайте мне знать ваш совет.

1 Ответ

0 голосов
/ 28 апреля 2018

Соединения rolling ведут себя как ожидалось.

Документ предлагает как:

+ Inf (или TRUE) бросает преобладающее значение в x вперед. Он также известен как последнее перенесенное наблюдение (LOCF).

Это означает, что последнее наблюдение может быть перенесено и объединено для многих записей. Точно так же происходит с 4-й строкой, где 2016-10-31 11:32:12 копируется и сопоставляется даже со следующей записью (2016-10-31 14:50:00).

Простой способ решить эту проблему - сопоставить lag значение websession_led_purchase с текущей строкой, если эти две совпадают, а затем установить значение в текущей строке как NA. Это обеспечит перенос данных только один раз.

library(lubridate)
library(data.table)

setDT(DT1)
setDT(DT2)

DT1[,':='(date_time = dmy_hms(web_date_time), web_date_time = dmy_hms(web_date_time))]
DT2[, ':='(date_time = dmy_hms(purchase_date_time), 
                purchase_date_time = dmy_hms(purchase_date_time)) ]

setkey(DT1, user, date_time)
setkey(DT2, user, date_time)

DT1[DT2, roll= Inf][,.(user, purchase_date_time, 
 websession_led_purchase = as.POSIXct(ifelse(!is.na(shift(web_date_time)) & 
    web_date_time == shift(web_date_time), NA, web_date_time), 
    origin = "1970-01-01"))]

# user  purchase_date_time    websession_led_purchase
# 1:    1 2016-10-29 18:10:00                    <NA>
# 2:    1 2016-10-29 18:11:00     2016-10-29 19:10:03
# 3:    2 2016-10-31 11:35:12     2016-10-31 11:32:12
# 4:    2 2016-10-31 14:50:00                    <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...