Пакет data.table
очень хорошо подходит для такого рода неравных объединений.
df1[, res:=0L][match(df2$dateC, dateB),
res := df2[.SD, on=.(ID, dateC > dateA), .N, by=.EACHI]$N]
df1
В приведенном выше коде инициализируйте результат в 0.
Затем вы вводите df1
, сопоставляя значения между dateB
и dateC
.
Затем вы присоединяете подсекцию df1
к df2
, используя ID
и dateC > dateA
.
Для каждой строки df1
(т. Е. .EACHI
) вернуть количество строк.
Поскольку результаты представляют собой data.table, $N
вернет столбец с именем N после вычисления.
Или же, используя equi-join
df1[, res:=0L][df2, on=.(ID, dateB=dateC),
res := df2[.SD, on=.(ID, dateC > dateA), .N, by=.EACHI]$N][]
данные:
library(data.table)
df1 <- fread("ID dateA dateB
17 27/06/12 26/07/12
17 21/02/13 21/02/13
17 23/01/14 23/01/14
17 5/02/15 5/02/15
17 28/11/16 16/06/16
18 25/07/13 22/05/13
18 29/10/14 1/12/14
18 11/05/15 1/12/14
21 27/09/12 16/07/12
21 25/07/14 11/08/14
21 15/07/15 24/02/15")
cols <- c("dateA", "dateB")
df1[, (cols) := lapply(.SD, as.Date, format="%d/%m/%y"), .SDcols=cols]
df2 <- fread("ID dateC
17 09/02/12
17 26/07/12
17 21/02/13
17 23/01/14
17 19/06/14
17 24/07/14
17 5/02/15
17 26/02/15
17 28/05/15
17 20/08/15
17 24/03/16
17 16/06/16
18 22/05/13
18 16/10/13
18 5/05/14
18 1/12/14
21 16/07/12
21 27/05/13
21 10/02/14
21 11/08/14
21 24/02/15")
df2[, dateC := as.Date(dateC, "%d/%m/%y")]