Как мне соединить две разные таблицы в зависимости от номера и времени номерного знака? - PullRequest
2 голосов
/ 03 октября 2019

Я новичок в R и пытаюсь объединить 2 набора данных, основанных на номере автомобильного номера и дате / времени.

Набор данных 1

LicensePlate DateTime
XLP1234P     09-JUN-18 02.52.40.144000000 PM
XLP2345P     18-JUL-18 11.22.46.855000000 AM
XLP3456P     18-JUL-18 11.22.46.856000000 AM
XLP4567P     18-JUL-18 11.22.46.856000000 AM
XLP5678P     18-JUL-18 11.22.46.857000000 AM
XLP6789P     18-JUL-18 11.22.46.858000000 AM

Набор данных 2

LicensePlate DateTime
XLP1234P     09-JUN-18 02.55.40.144000000 PM 
XLP2345P     18-JUL-18 11.30.46.855000000 AM

В основном, набор данных записывается двумя различными комплектами оборудования, и, следовательно, будет небольшая разница во времени. Я хотел бы присоединиться к первому набору на основе номерного знака с приемлемой разницей во времени в 10 минут.

left_join позволяет мне объединять данные по значению столбца, но как мне установить условие, при котором дата-время имеет подходящий диапазон?

Ответы [ 3 ]

5 голосов
/ 03 октября 2019

Вот возможный подход к неравному соединению с использованием пакета . Я опущу это, если OP только ищет подход

DT1[, c("start", "end") := .(DateTime - 60*10, DateTime + 60*10)]
DT2[DT1, on=.(LicensePlate=LicensePlate, DateTime>=start, DateTime<=end),
    .(LicensePlate, i.DateTime, x.DateTime)]

выход:

   LicensePlate          i.DateTime          x.DateTime
1:     XLP1234P 2018-06-09 02:52:40 2018-06-09 02:55:40
2:     XLP2345P 2018-07-18 11:22:46 2018-07-18 11:30:46
3:     XLP3456P 2018-07-18 11:22:46                <NA>
4:     XLP4567P 2018-07-18 11:22:46                <NA>
5:     XLP5678P 2018-07-18 11:22:46                <NA>
6:     XLP6789P 2018-07-18 11:22:46                <NA>

данные:

library(data.table)
DT1 <- fread("LicensePlate,DateTime 
XLP1234P,09-JUN-18 02.52.40.144000000 PM 
XLP2345P,18-JUL-18 11.22.46.855000000 AM 
XLP3456P,18-JUL-18 11.22.46.856000000 AM 
XLP4567P,18-JUL-18 11.22.46.856000000 AM 
XLP5678P,18-JUL-18 11.22.46.857000000 AM 
XLP6789P,18-JUL-18 11.22.46.858000000 AM")

DT2 <- fread("LicensePlate,DateTime
XLP1234P,09-JUN-18 02.55.40.144000000 PM 
XLP2345P,18-JUL-18 11.30.46.855000000 AM")

DT1[, DateTime := as.POSIXct(DateTime, format="%d-%b-%y %H.%M.%OS")]
DT2[, DateTime := as.POSIXct(DateTime, format="%d-%b-%y %H.%M.%OS")]
2 голосов
/ 03 октября 2019

используя данные, предоставленные ответом от @ chinsoon12

, здесь есть другой способ использования data.table;переходящее соединение на 10-минутном окне

#set keys
setkey( DT1, LicensePlate, DateTime )
setkey( DT2, LicensePlate, DateTime )
#rolling update join, looking 10 minutes ahead
DT1[, DateTime2 := DT2[DT1, x.DateTime, roll = -600 ] ][]

#    LicensePlate            DateTime           DateTime2
# 1:     XLP1234P 2018-06-09 02:52:40 2018-06-09 02:55:40
# 2:     XLP2345P 2018-07-18 11:22:46 2018-07-18 11:30:46
# 3:     XLP3456P 2018-07-18 11:22:46                <NA>
# 4:     XLP4567P 2018-07-18 11:22:46                <NA>
# 5:     XLP5678P 2018-07-18 11:22:46                <NA>
# 6:     XLP6789P 2018-07-18 11:22:46                <NA>
1 голос
/ 03 октября 2019

Самый простой способ сделать это - создать переменную объединения, округленную до выбранного диапазона.

dataset_2 <- dataset_2 %>%
    mutate(join_date = lubridate::round_date(DateTime, "10 minutes"))

dataset_1 <- dataset_1 %>%
    mutate(join_date = lubridate::round_date(DateTime, "10 minutes")) %>%
    left_join(dataset_2, by = c("LicensePlate", "join_date"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...