количество нетдат на удостоверение личности после матча - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу создать столбец (res) в df1, который перечисляет количество (которое будет нисходящим) для каждого идентификатора.Этот столбец будет соответствовать дате B, а дата C будет подсчитывать, сколько дат C (из df2) больше, чем dateA.В дате C для каждого идентификатора будет больше дат, чем для даты B.

df1

ID  date A      date B
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

df2

ID  date C
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

df1 с добавлением нового столбца:

df1
ID  date A      date B     res
17  27/06/12    26/07/12    11
17  21/02/13    21/02/13    9
17  23/01/14    23/01/14    8
17  5/02/15     5/02/15     5
17  28/11/16    16/06/16    0 
18  25/07/13    22/05/13    3
18  29/10/14    1/12/14     1
18  11/05/15    1/12/14     0
21  27/09/12    16/07/12    4
21  25/07/14    11/08/14    2
21  15/07/15    24/02/15    0

1 Ответ

0 голосов
/ 25 апреля 2018

Пакет 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")]
...