Я изменил способ. Он не использует allow.cartesian = TRUE, чтобы избежать огромного слияния, и использует lapply для циклического перехода по другой дате для идентификатора в присоединении. Попробуй

аюсь обогатить один набор данных (приверженность) на основе подмножеств из другого (lsr). Для каждого отдельного ряда в соответствии я хочу рассчитать (в качестве третьего столбца) лекарство, доступное для реализации предписанного режима. У меня есть функция, которая возвращает релевантный результат, но она работает в течение нескольких дней только для подмножества всех данных, на которых мне нужно ее запустить.

Наборы данных:

 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)

Я привык работать с dplyr, но это было намного медленнее, и я переписал вещи для data.table, чтобы попробовать. Меня сводит с ума тот факт, что мои коллеги, работающие с SAS, утверждают, что это не займет у них много времени, когда мне понадобятся часы, чтобы загрузить сами данные в оперативную память. (Fread вылетает R на нескольких моих наборах данных). Приверженность составляет 1,5 миллиона строк, а Lsr - несколько сотен миллионов. строк.

Моя рабочая функция

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

Я не знаю лучшего подхода: я изучал использование базы данных SQL, но, насколько я понимаю, это не должно быть быстрее, когда мои данные помещаются в ОЗУ (у меня есть 256 ГБ). Поскольку таблица данных присоединения фактически представляет собой каждый отдельный идентификатор, повторяемый в течение 500 периодов времени (т. Е. Идентификатор 1: в момент времени 1, время 2, время 3 ... время 500, идентификатор 2: в момент времени 1, время 2 ... и т. Д.) Я также рассмотрел использование функции by для ID на lsr и кое-как, как вставить этот интервал времени (1: 500) в функцию в j.

Я надеюсь, что кто-то может указать на то, как я неэффективно использую функцию apply, не применяя ее каким-либо образом внутри data.table-framework и, таким образом, теряя эффективность сборки. Но так как я собираюсь работать с этими данными и аналогичными размерами данных, я буду признателен за любые конкретные предложения по решению этого более быстрого или общего предложения по ускорению работы с использованием других методов.