#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