Вы можете выполнить неравное объединение с пакетом data.table (столбцы date
необходимо сначала преобразовать в формат даты, см. Ниже под заголовком Data ):
library(data.table)
setDT(cases)
setDT(events)
cases[events, on = .(id = caseId, date < date), events := .N, by = .EACHI][]
Результат:
id date var1 events
1: 1 2017-01-02 B 1
2: 2 2016-02-03 A NA
3: 3 2015-02-12 A 1
4: 4 2016-01-03 B NA
5: 5 2016-08-09 B 1
Вариант этого:
cases[, events := events[cases, on = .(caseId = id, date > date), .N, by = .EACHI]$N][]
Результат этого:
id date var1 events
1: 1 2017-01-02 A 1
2: 2 2016-02-03 A 0
3: 3 2015-02-12 A 1
4: 4 2016-01-03 A 0
5: 5 2016-08-09 A 1
Данные:
cases <- data.frame(id=1:5, date=c("2017-01-02","2016-02-03","2015-02-12","2016-01-03","2016-08-09"),
var1=sample(c("A", "B"), 5, replace=T))
events <- data.frame(id=1:10,
date=c("2017-01-01","2016-12-12","2016-07-04","2017-04-03","2015-02-13","2015-01-01","2013-05-07","2015-12-25","2016-05-04","2016-10-11"),
caseId=c(1,1,1,1,3,3,3,4,5,5))
cases$date <- as.Date(cases$date)
events$date <- as.Date(events$date)