Вы можете сначала попробовать:
DT <- rnfl[neighbors, on=.(ID, date>=common_date_begin, date<=common_date_end),
c(mget(paste0("i.", names(neighbors))),
by=.EACHI,
.(date=x.date, v1=x.value))][, (1L:3L) := NULL]
setnames(DT, names(DT), gsub("i.", "", names(DT), fixed=TRUE))
DT[rnfl, on=.(ID_nearest=ID, date), v2 := value]
DT[, .(correlation=cor(v1, v2)), names(neighbors)]
Если он слишком медленный, мы можем попробовать другой подход.
данные, а также из предыдущего qn:
library(data.table)
rnfl <- data.table(ID=c(1,1,1,1,1,2,2,2,2,2),
date=Sys.Date() + c(0:4, 2:6),
value=c(17.6, 5.6, 4.5, 8.3, 11.7, 10.7, 15.6, 11.6, 8.3, 2.3))
near <- data.table(ID=1, ID_nearest=2)
summ <- rnfl[, .(startdate=date[1L], enddate=date[.N]),
.(ID, g=cumsum(c(0L, diff(date)!=1L)))]
setkey(summ, startdate, enddate)
olap <- unique(foverlaps(summ, summ)[ID!=i.ID, .(
ID1=pmin(ID, i.ID),
ID2=pmax(ID, i.ID),
common_date_begin=pmax(startdate, i.startdate),
common_date_end=pmin(enddate, i.enddate))])
near[, c("ID1", "ID2") := .(pmin(ID, ID_nearest), pmax(ID, ID_nearest))]
cols <- c("common_date_begin", "common_date_end")
neighbors <- near[olap, on=.(ID1, ID2), (cols) := mget(paste0("i.", cols))][,
n := as.integer(common_date_end - common_date_begin)]