Как найти следующую последнюю дату в течение 30 дней от существующих дат в R? - PullRequest
0 голосов
/ 20 января 2019

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

dataset_A

id        disch_date
1234      2018-03-14
1234      2018-03-17
1234      2018-04-19
2345      2018-04-15
2345      2018-05-15
3456      2018-05-16

dataset_B

id        visit_date
1234      2018-03-17
1234      2018-03-20
1234      2018-02-28
1234      2018-04-30
2345      2018-05-12
2345      2018-05-13
2345      2018-07-17
3456      2018-05-16
3456      2018-05-19

expected_output

id        disch_date     visit_date
1234      2018-03-14     2018-03-17
1234      2018-03-17     2018-03-17
1234      2018-04-19     2018-04-30
2345      2018-04-15     2018-05-12
2345      2018-05-15     NA
3456      2018-05-16     2018-05-16

Пробовал:

dataset_A$visit_date <- sapply(dataset_A$disch_date, function(x) any( abs(x-dataset_B$visit_date) <=  30))

Ответы [ 2 ]

0 голосов
/ 20 января 2019

dplyr версия:

library(dplyr)

inner_join(dataset_A, dataset_B, by = "id") %>% 
    filter(visit_date >= disch_date & visit_date - disch_date <= 30) %>% 
    group_by(id, disch_date) %>% 
    summarize(visit_date = min(visit_date)) %>% 
    left_join(dataset_A, ., by = c("id", "disch_date"))

Выход:

# A tibble: 6 x 3
     id disch_date visit_date
  <dbl> <date>     <date>    
1  1234 2018-03-14 2018-03-17
2  1234 2018-03-17 2018-03-17
3  1234 2018-04-19 2018-04-30
4  2345 2018-04-15 2018-05-12
5  2345 2018-05-15 NA        
6  3456 2018-05-16 2018-05-16
0 голосов
/ 20 января 2019

A data.table подход:

library(data.table)

setDT(dataset_A)[, `:=` (disch_date = as.Date(disch_date),
                   date_join = as.Date(disch_date))]
setDT(dataset_B)[, `:=` (visit_date = as.Date(visit_date), 
                   date_join = as.Date(visit_date))]

dataset_final <- dataset_B[dataset_A, on = .(id, date_join), roll = -30][, date_join := NULL]

Вывод:

     id visit_date disch_date
1: 1234 2018-03-17 2018-03-14
2: 1234 2018-03-17 2018-03-17
3: 1234 2018-04-30 2018-04-19
4: 2345 2018-05-12 2018-04-15
5: 2345       <NA> 2018-05-15
6: 3456 2018-05-16 2018-05-16

Вы также можете получить тот же порядок столбцов, что и в ожидаемом результате, выполнив:

dataset_final <- dataset_B[dataset_A, 
                           .(id, disch_date, visit_date), 
                           on = .(id, date_join), 
                           roll = -30]

Вывод:

     id disch_date visit_date
1: 1234 2018-03-14 2018-03-17
2: 1234 2018-03-17 2018-03-17
3: 1234 2018-04-19 2018-04-30
4: 2345 2018-04-15 2018-05-12
5: 2345 2018-05-15       <NA>
6: 3456 2018-05-16 2018-05-16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...