Слияние с датафреймом со временем - PullRequest
2 голосов
/ 01 апреля 2020

У меня есть два кадра данных (GPSData и ACCData), они исходят из одного и того же кадра данных, но я использовал функцию только для ACCData. Теперь я хотел бы присоединиться к ним. Но иногда у меня не одинаковое количество строк, поэтому я не могу присоединиться к ним и быть уверенным, что временные линии соответствуют.

Это данные GPSData df:

device_id         UTC_datetime    UTC_date  UTC_time   datatype 

182197  2020-02-19 13:53:03  2020-02-19  13:53:03      GPS       
182197  2020-02-19 13:53:28  2020-02-19  13:53:28      GPS        
182197  2020-02-19 13:53:59  2020-02-19  13:53:59      GPS       
182197  2020-02-19 13:54:30  2020-02-19  13:54:30      GPS       
182197  2020-02-19 13:54:58  2020-02-19  13:54:58      GPS      
182197  2020-02-19 13:55:28  2020-02-19  13:55:28      GPS     

Это ACCData df:

 start.timestamp  burst.id  axis.sample  burst.duration
2020-02-19 13:53:04         0          200              9  
2020-02-19 13:53:29         1          200              9  
2020-02-19 13:54:00         2          200              9  
2020-02-19 13:54:31         3          200              9  
2020-02-19 13:54:59         4          200              9  
2020-02-19 13:55:29         5          200              9  

Мне нужна строка кода, которая говорит, что в GPSData сохраняются только строки, соответствующие пакет ACCData с UTC_Datetime, близким к start.timesstamp в ACCData, большую часть времени пакет ACCData начинается через 1 или 2 секунды после положения GPS. Надеюсь, вы можете помочь мне, это очень поможет в моем исследовании. Спасибо !

1 Ответ

1 голос
/ 01 апреля 2020

Это, на первый взгляд, сложная проблема, но ее легко решить, используя скользящее соединение в 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...