образец данных
взято из комментария, слегка изменено
library(data.table)
lookup <- data.table(routeID = c( 19,19,64,64), milePost = c( 102,0,69.69,42.43), lat = c( 32.19912,31.33468,35.93829,35.46088), lon = c( -110.9789,-110.9412,-111.6610,-112.1715) )
dataTable <- data.table( date = c("2015-04-01", "2015-09-30", "2015-09-30","2015-09-30", "2015-10-03", "2015-11-03"),
time = c("05:25:00","07:25:00","07:25:45","04:4:00","02:29:00","07:25:44"),
routeID = c( 19,19,64,64,NA,64),
milePost = c( 100,1,70,40,NA,70) )
код
на последних ключах присоединяемых data.tables выполняется скользящее соединение. Поэтому установите RouteId в качестве первого ключа и milePost в качестве второго
setkey( lookup, routeID, milePost )
setkey( dataTable, routeID, milePost )
затем выполните соединение Rollin Gupdate, где вы соединяете столбцы lat, lon и Milepost из таблицы lookup
в таблицу dataTable
.
#rolling update join on dataTable
dataTable[ lookup,
`:=`( lat = i.lat,
lon = i.lon,
milePost.lookup = i.milePost),
roll = "nearest" ][]
выход
# date time routeID milePost lat lon milePost.lookup
# 1: 2015-10-03 02:29:00 NA NA NA NA NA
# 2: 2015-09-30 07:25:00 19 1 31.33468 -110.9412 0.00
# 3: 2015-04-01 05:25:00 19 100 32.19912 -110.9789 102.00
# 4: 2015-09-30 04:4:00 64 40 35.46088 -112.1715 42.43
# 5: 2015-09-30 07:25:45 64 70 35.93829 -111.6610 69.69
# 6: 2015-11-03 07:25:44 64 70 NA NA NA