Data.table: cómo obtener los subconjuntos increíblemente rápidos que promete y aplicarlos a un segundo data.table

Estoy tratando de enriquecer un conjunto de datos (adherencia) basado en subconjuntos de otro (lsr). Para cada fila individual en cumplimiento, quiero calcular (como una tercera columna) el medicamento disponible para implementar el régimen prescrito. Tengo una función que devuelve el resultado relevante, pero se ejecuta durante días en solo un subconjunto de los datos totales en los que tengo que ejecutarlo.

Los conjuntos de datos son:

 library(dplyr)
library(tidyr)
library(lubridate)
library(data.table)

adherence <- cbind.data.frame(c("1", "2", "3", "1", "2", "3"), c("2013-01-01", "2013-01-01", "2013-01-01", "2013-02-01", "2013-02-01", "2013-02-01"))
names(adherence)[1] <- "ID" 
names(adherence)[2] <- "year"
adherence$year <- ymd(adherence$year)

lsr <- cbind.data.frame(
  c("1", "1", "1", "2", "2", "2", "3", "3"), #ID
  c("2012-03-01", "2012-08-02", "2013-01-06","2012-08-25", "2013-03-22", "2013-09-15", "2011-01-01", "2013-01-05"), #eksd
  c("60", "90", "90", "60", "120", "60", "30", "90") # DDD
)
names(lsr)[1] <- "ID"
names(lsr)[2] <- "eksd"
names(lsr)[3] <- "DDD"

lsr$eksd <- as.Date((lsr$eksd))
lsr$DDD <- as.numeric(as.character(lsr$DDD))
lsr$ENDDATE <- lsr$eksd + lsr$DDD
lsr <- as.data.table(lsr)

adherence <- as.data.table(adherence)

Estoy acostumbrado a trabajar con dplyr, pero fue mucho más lento y reescribí cosas para data.table para probarlo. Me está volviendo loco que mis colegas que trabajan con SAS afirman que esto no les tomaría mucho tiempo, cuando me lleva horas cargar los datos en la RAM. (Fread bloquea R en varios de mis conjuntos de datos). La adherencia es de 1,5 millones de filas y lsr es de unos cientos de millones. filas

Mi función de trabajo es

function.AH <- function(x) {
  lsr[ID == x[1] & eksd <= x[2] & ENDDATE > x[2], ifelse(.N == 0, 0, sum(as.numeric(ENDDATE - as.Date(x[2]))))]
}
setkey(lsr, ID, eksd, ENDDATE)
adherence$AH <-apply (adherence, 1,  FUN = function.AH) #DESIRED OUTPUT

No conozco el mejor enfoque: he buscado usar una base de datos SQL, pero según tengo entendido, esto no debería ser más rápido cuando mis datos se ajustan a la RAM (tengo 256 GB). Dado que la tabla de datos de adherencia es en realidad cada ID individual repetida durante 500 períodos de tiempo (es decir, ID 1: en el tiempo 1, tiempo 2, tiempo 3 ... tiempo 500, ID 2: en el tiempo 1, tiempo 2 ... etc.) También consideré usar la función by en ID en lsr y de alguna manera incrustar este intervalo de tiempo (1: 500) en la función en j.

Espero que alguien pueda señalar cómo estoy usando la función de aplicación de manera ineficiente al no aplicarla de alguna manera dentro de data.table-framework y perder así la eficiencia de la compilación. Pero como voy a trabajar con estos datos y tamaños de datos similares, agradecería cualquier sugerencia específica para resolver esto o sugerencias generales para obtener tiempos de ejecución más rápidos utilizando otros métodos.

Respuestas a la pregunta(2)

Su respuesta a la pregunta