Если я правильно понимаю, ОП хочет получить те строки df2
(включая все столбцы), которые имеют совпадающие ID
в df1
и, где разница во времени меток времени Datetime
между df1
и df2
меньше или равно заданному значению.
Итак, для заданных выборочных данных
- если допустимая разница во времени составляет не более 20 секунд, возвращаются обе строки
df2
.
- Если допустимая разница во времени составляет не более 10 секунд, возвращается только вторая строка
df2
с ID == 456
.
- Если допустимая разница во времени составляет не более 5 секунд, возвращается пустой набор данных, поскольку ни одна из
df2
строк не удовлетворяет условиям.
Одним из возможных подходов является использование неэквивалентного соединения, которое доступно с data.table:
library(data.table)
timediff <- 10 # given time difference in seconds
setDT(df1)[, Datetime := as.POSIXct(Datetime)]
setDT(df2)[, Datetime := as.POSIXct(Datetime)]
df2[, c("from", "to") := .(Datetime - timediff, Datetime + timediff)]
df3 <- df2[df1, on = c("ID", "from <= Datetime", "to >= Datetime"),
nomatch = NULL, .SD][
, c("from", "to") := NULL][]
df3
ID Datetime
1: 456 2021-04-02 09:50:23
Если код запускается с
timediff <- 20
результат
df3
ID Datetime
1: 123 2021-04-02 09:50:31
2: 456 2021-04-02 09:50:23
Если код запускается с
timediff <- 5
df3
становится пустой таблицей данных.
EDIT: Show Datetime
from df1
and df2
Автор запрос OP, вот версия, которая возвращает оба столбца Datetime
из df1
и df2
, переименованных в Datetime1
и Datetime2
, соответственно:
library(data.table)
timediff <- 20 # given time difference in seconds
setDT(df1)[, Datetime := as.POSIXct(Datetime)]
setDT(df2)[, Datetime := as.POSIXct(Datetime)]
df2[, c("from", "to") := .(Datetime - timediff, Datetime + timediff)]
df3 <- df2[setDT(df1), on = c("ID", "from <= Datetime", "to >= Datetime"),
nomatch = NULL, .(ID, Datetime1 = i.Datetime, Datetime2 = x.Datetime)]
df3
ID Datetime1 Datetime2
1: 123 2021-04-02 09:50:11 2021-04-02 09:50:31
2: 456 2021-04-02 09:50:15 2021-04-02 09:50:23
11.07.2021