Объединение двух фреймов данных в R на основе максимальной метки

Привет у меня есть две таблицы (table1 и table2 ниже) и хотел бы присоединиться к ним на основе ближайшей метки времени для формирования expected_output. Какое-то решение с участием dplyr было бы здорово, если это возможно, но не если это еще больше усложняет ситуацию.

table1 = 
structure(list(date = structure(c(1437051300, 1434773700, 1431457200
), class = c("POSIXct", "POSIXt"), tzone = ""), val1 = c(94L, 
33L, 53L)), .Names = c("date", "val1"), row.names = c(NA, -3L
), class = "data.frame")

table2 = 
structure(list(date = structure(c(1430248288, 1435690482, 1434050843
), class = c("POSIXct", "POSIXt"), tzone = ""), val2 = c(67L, 
90L, 18L)), .Names = c("date", "val2"), row.names = c(NA, -3L
), class = "data.frame")

expected_output = 
structure(list(date = structure(c(1437051300, 1434773700, 1431457200
), class = c("POSIXct", "POSIXt"), tzone = ""), val1 = c(94L,
33L, 53L), val2 = c(90L, 18L, 67L)), .Names = c("date", "val1", 
"val2"), row.names = c(NA, -3L), class = "data.frame")

2 ответов


использование rolling присоединяется особенность data.table С roll = "nearest":

require(data.table) # v1.9.6+
setDT(table1)[, val2 := setDT(table2)[table1, val2, on = "date", roll = "nearest"]]

здесь val2 столбец создается путем выполнения вступить в столбце date С . Для каждой строки table1$date, ближайшая соответствующая строка из table2$date вычисляется, и val2 для соответствующей строки извлекается.


Это может быть медленно, но...

d   <- function(x,y) abs(x-y) # define the distance function
idx <- sapply( table1$date, function(x) which.min( d(x,table2$date) )) # find matches

cbind(table1,table2[idx,-1,drop=FALSE])
#                  date val1 val2
# 2 2015-07-16 08:55:00   94   90
# 3 2015-06-20 00:15:00   33   18
# 1 2015-05-12 15:00:00   53   67

другой способ построения idx is max.col(-outer(table1$date, table2$date, d)).