Это просто в data.table
, используя roll
-аргумент
. Сначала создайте пример данных с фактическими датами
library( data.table )
DT1 <- fread("id | date
1 | 2014-02-04
1 | 2014-03-15
2 | 2014-02-04
2 | 2014-03-15")
DT2 <- fread("id | date | value
1 | 2014-02-07 | 100
2 | 2014-02-04 | 20
2 | 2014-03-22 | 80")
DT1[, date := as.Date( date ) ]
DT2[, date := as.Date( date ) ]
, теперь выполните обновление соединения на DT1,где столбцы date.y
и value
являются результатом объединения (влево) от DT2[ DT1, .( x.date, value), on = .(id, date), roll = -Inf ]
.
Этот код объединяет два столбца, id
и date
, аргумент roll -Inf
используется на последнем (т.е. date
). Чтобы убедиться, что возвращается date
-значение из DT2
, а не date
из DT1
, мы запрашиваем x.date
вместо date
(который возвращает date
-значение из DT1)
#rolling update join
DT1[, c("date.y", "value") := DT2[ DT1, .( x.date, value), on = .(id, date), roll = -Inf ]][]
# id date date.y value
# 1: 1 2014-02-04 2014-02-07 100
# 2: 1 2014-03-15 <NA> NA
# 3: 2 2014-02-04 2014-02-04 20
# 4: 2 2014-03-15 2014-03-22 80