Найти ближайшие временные метки между двумя фреймами данных и объединить разные столбцы, когда разница во времени <60 секунд

#r #merge #timestamp #closest

#r #слияние #временная метка #ближайший

Вопрос:

Мне нужно объединить два фрейма данных на основе ближайшей временной метки с максимальной разницей между временными метками в 60 секунд.

Например:

 library(lubridate)

df1 <- data.frame(Timestamp = ymd_hms(c("2020-01-01 00:00:00", 
                                        "2020-01-01 00:02:00", 
                                        "2020-01-01 00:04:00",
                                        "2020-01-01 00:06:00", 
                                        "2020-01-01 00:08:00", 
                                        "2020-01-01 00:10:00",
                                        "2020-01-01 00:12:00",
                                        "2020-01-01 00:14:00", 
                                        "2020-01-01 00:16:00")), 
                  Data  = c(1:9))

df2 <- data.frame(Timestamp = ymd_hms(c("2020-01-01 00:00:10", 
                                        "2020-01-01 00:02:30", 
                                        "2020-01-01 00:12:45",
                                        "2020-01-01 00:20:15")), 
                  Data  = c(10:13))
 

Данные непрерывно поступают с интервалами в 2 минуты df1 .
Вводятся спорадические данные df2 .
Наборы данных не имеют одинакового количества строк.

Мне нужно объединить df1$Data в новый столбец в df2 ( df2$df1_Data ), но только там, где разница во времени между df1$Timestamp и df2$Timestamp составляет менее 60 секунд.

В идеале вывод должен быть:

 >df2
            Timestamp   Data    df1_Data
1 2020-01-01 00:00:10   10      1
2 2020-01-01 00:02:30   11      2
3 2020-01-01 00:12:45   12      7
4 2020-01-01 00:20:15   13      NA
 

Мои навыки R еще не достигли уровня, на котором я могу самостоятельно решить эту проблему, и я не нашел ничего по этому конкретному вопросу, кто-нибудь захочет hep? Большое спасибо!

Ответ №1:

Это может быть выражено непосредственно в sql:

 library(sqldf)
sqldf("select a.*, b.Data df1_Data
  from df2 a
  left join df1 b on abs(a.Timestamp - b.Timestamp) < 60")
 

предоставление:

             Timestamp Data df1_Data
1 2019-12-31 19:00:10   10        1
2 2019-12-31 19:02:30   11        2
3 2019-12-31 19:12:45   12        7
4 2019-12-31 19:20:15   13       NA