Data.table: como obter os subconjuntos incrivelmente rápidos que promete e aplicar a um segundo data.table

Estou tentando enriquecer um conjunto de dados (aderência) com base em subconjuntos de outro (lsr). Para cada linha individual de adesão, quero calcular (como uma terceira coluna) o medicamento disponível para implementar o regime prescrito. Eu tenho uma função que retorna o resultado relevante, mas é executada por dias em apenas um subconjunto do total de dados em que tenho que executá-lo.

Os conjuntos de dados são:

 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)

Estou acostumado a trabalhar com o dplyr, mas foi muito mais lento e reescrevi as coisas para o data.table para testá-lo. Está me deixando louco que meus colegas que trabalham com SAS afirmam que isso não levaria muito tempo para eles, quando levo horas apenas para carregar os dados na RAM. (fread trava R em vários dos meus conjuntos de dados). A adesão é de 1,5 milhões de linhas e o LSR é de algumas centenas de milhões. linhas.

Minha função de trabalho é

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

Não conheço a melhor abordagem: procurei usar um banco de dados SQL, mas, pelo que entendi, isso não deveria ser mais rápido quando meus dados se encaixam na RAM (eu tenho 256 GB). Como a tabela de dados de adesão é, na verdade, cada ID individual repetido por 500 períodos de tempo (ie ID 1: no tempo 1, tempo 2, tempo 3 ... tempo 500, ID 2: no tempo 1, tempo 2 ... etc.) Também considerei o uso da função by no ID no lsr e como esse intervalo de tempo (1: 500) foi incorporado na função em j.

Espero que alguém possa apontar como estou usando a função de aplicação de forma ineficiente, sem aplicá-la de alguma forma dentro da estrutura data.table e, assim, perdendo a compilação em eficiência. Mas, como vou trabalhar com esses dados e com tamanhos similares, gostaria de receber sugestões específicas para solucionar essas sugestões mais rápidas ou gerais para obter tempos de execução mais rápidos usando outros métodos.

questionAnswers(2)

yourAnswerToTheQuestion