Это, на первый взгляд, сложная проблема, но ее легко решить, используя скользящее соединение в data.table
.
library(data.table)
library(fasttime)
setDT(GPSData)
setDT(ACCData)
GPSData[,Time := fastPOSIXct(UTC_datetime)]
ACCData[,Time := fastPOSIXct(start.timestamp)]
Result <- GPSData[ACCData,on = "Time", roll="nearest"]
Result[,.(device_id,UTC_datetime,start.timestamp,burst.id,axis.sample,burst.duration)]
# device_id UTC_datetime start.timestamp burst.id axis.sample burst.duration
#1: 182197 2020-02-19 13:53:03 2020-02-19 13:53:04 0 200 9
#2: 182197 2020-02-19 13:53:28 2020-02-19 13:53:29 1 200 9
#3: 182197 2020-02-19 13:53:59 2020-02-19 13:54:00 2 200 9
#4: 182197 2020-02-19 13:54:30 2020-02-19 13:54:31 3 200 9
#5: 182197 2020-02-19 13:54:58 2020-02-19 13:54:59 4 200 9
#6: 182197 2020-02-19 13:55:28 2020-02-19 13:55:29 5 200 9
После объединения вы можете вычислить разницу в UTC_datetime
и start.timestamp
для отфильтровать строки, которые слишком далеко друг от друга.
Result[,`:=`(UTC_date = NULL, UTC_time = NULL, datatype = NULL, Time = NULL, UTC_datetime = fastPOSIXct(UTC_datetime), start.timestamp = fastPOSIXct(start.timestamp))]
Result[,Diff := abs(UTC_datetime - start.timestamp)]
Result[Diff < 5,]
# device_id UTC_datetime start.timestamp burst.id axis.sample burst.duration Diff
#1: 182197 2020-02-19 08:53:03 2020-02-19 08:53:04 0 200 9 1 secs
#2: 182197 2020-02-19 08:53:28 2020-02-19 08:53:29 1 200 9 1 secs
#3: 182197 2020-02-19 08:53:59 2020-02-19 08:54:00 2 200 9 1 secs
#4: 182197 2020-02-19 08:54:30 2020-02-19 08:54:31 3 200 9 1 secs
#5: 182197 2020-02-19 08:54:58 2020-02-19 08:54:59 4 200 9 1 secs
#6: 182197 2020-02-19 08:55:28 2020-02-19 08:55:29 5 200 9 1 secs
Если вы пытаетесь сделать это с помощью device_id, вы можете объединить несколько столбцов, но значение last может меняться.
GPSData[ACCData,on = c("device_id","Time"), roll="nearest"]
Данные
GPSData <- structure(list(device_id = c(182197L, 182197L, 182197L, 182197L,
182197L, 182197L), UTC_datetime = structure(1:6, .Label = c("2020-02-19 13:53:03",
"2020-02-19 13:53:28", "2020-02-19 13:53:59", "2020-02-19 13:54:30",
"2020-02-19 13:54:58", "2020-02-19 13:55:28"), class = "factor"),
UTC_date = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "2020-02-19", class = "factor"),
UTC_time = structure(1:6, .Label = c("13:53:03", "13:53:28",
"13:53:59", "13:54:30", "13:54:58", "13:55:28"), class = "factor"),
datatype = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "GPS", class = "factor"),
Time = structure(c(1582120383, 1582120408, 1582120439, 1582120470,
1582120498, 1582120528), class = c("POSIXct", "POSIXt"))), class = "data.frame", row.names = c(NA,
-6L))
ACCData <- structure(list(start.timestamp = structure(1:6, .Label = c("2020-02-19 13:53:04",
"2020-02-19 13:53:29", "2020-02-19 13:54:00", "2020-02-19 13:54:31",
"2020-02-19 13:54:59", "2020-02-19 13:55:29"), class = "factor"),
burst.id = 0:5, axis.sample = c(200L, 200L, 200L, 200L, 200L,
200L), burst.duration = c(9L, 9L, 9L, 9L, 9L, 9L), Time = structure(c(1582120384,
1582120409, 1582120440, 1582120471, 1582120499, 1582120529
), class = c("POSIXct", "POSIXt"))), class = "data.frame", row.names = c(NA,
-6L))