Нечеткое объединение с использованием времени и гео-координат в R - PullRequest
0 голосов
/ 02 октября 2018

Там два фрейма данных с разрозненной информацией.Единственными столбцами, которые у них общие, являются поля datetime и lat / long.Можно ли создать третий фрейм данных, используя R или R-пакет (или, возможно, Python / Pandas), который берет подмножество строк из обоих фреймов данных с одинаковыми полями даты и долготы / долготы?Соединения должны быть нечеткими, не точными, плюс / минус час и десятая градус.

Пример ввода:

df_1
Datetime            Latitude    Longitude
2018-10-01 08:27:10 34.8014080  103.8499800
2018-09-30 04:55:51 43.3367432  44.158934
2018-02-28 17:03:27 37.0399910  115.6672080

df_2
Datetime            Latitude    Longitude
2018-10-01 08:57:10 34.8014080  103.8999800
2018-09-30 04:55:51 43.3367432  48.158934
2018-02-27 17:03:27 37.0399910  115.6672080

Пример вывода:

fuzzy_geo_temporal_join(df_1, df_2, time = 60, lat = 0.01, long = 0.01)
df_3
df_1 Datetime       df_1 Lat    df_1 Long    df_2 Datetime       df_2 Lat    df_2 Long
2018-10-01 08:27:10 34.8014080  103.8499800  2018-10-01 08:57:10 34.8014080  103.8999800

ПримечаниеВ этом примере первый совпадает и помещается в новый фрейм данных.Из-за нечетких параметров второй и третий не имеют значения.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Это звучит как работа для неэквивалентного объединения, используя data.table!

library( data.table )

пример данных

dt1 <- fread( "Datetime,            Latitude,    Longitude
2018-10-01 08:27:10, 34.8014080,  103.8499800
2018-09-30 04:55:51, 43.3367432,  44.158934
2018-02-28 17:03:27, 37.0399910,  115.6672080", header = T)

dt2  <- fread("Datetime,            Latitude,    Longitude
2018-10-01 08:57:10, 34.8014080,  103.8999800
2018-09-30 04:55:51, 43.3367432,  48.158934
2018-02-27 17:03:27, 37.0399910,  115.6672080", header = T)

данные-подготовка

#set datetimes to POSIXct
dt1[, Datetime := as.POSIXct( Datetime, format = "%Y-%m-%d %H:%M:%S") ]
dt2[, `:=`(Datetime = as.POSIXct( Datetime, format = "%Y-%m-%d %H:%M:%S" ) )]

соединение

#create boundaries
dt2[, `:=`(Datetime_max = Datetime + 3600,
           Datetime_min = Datetime - 3600,
           Latitude_max = Latitude + 0.1,
           Latitude_min = Latitude - 0.1,
           Longitude_max = Longitude + 0.1,
           Longitude_min = Longitude - 0.1) ]

#perform non-equi join
dt1[ dt2, on = .( Datetime <= Datetime_max, 
                  Datetime >= Datetime_min, 
                  Latitude <= Latitude_max, 
                  Latitude >= Latitude_min, 
                  Longitude <= Longitude_max, 
                  Longitude >= Longitude_min ),
     nomatch = 0L]

результат

#               Datetime Latitude Longitude          Datetime.1 Latitude.1 Longitude.1          i.Datetime i.Latitude i.Longitude
# 1: 2018-10-01 09:57:10 34.90141       104 2018-10-01 07:57:10   34.70141       103.8 2018-10-01 08:57:10   34.80141       103.9
0 голосов
/ 02 октября 2018

Это может сработать ...

install.packages("fuzzyjoin")
library(fuzzyjoin)

close_dates <- difference_inner_join(df1, df2, by = "Datetime", max_dist = 60)
close_lats <-  difference_inner_join(close_dates, df2, by = "Latitude", max_dist = 0.01)
df3 <- difference_inner_join(close_lats, df2, by = "Longitude", max_dist = 0.01)
...