如何在R中现有日期的30天内找到下一个最近的日期?

时间:2019-01-20 11:56:15

标签: r

我有一个类似于下面的dataset_A,我想知道dataset_B中每个日期中相同ID的下一个(或)未来30天的最近日期是什么 数据集_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 :(得分:1)

一种const char* s1 = "hello"; const char* s2 = "world"; String input = String() + s1 + " " + s2; 方法:

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]

答案 1 :(得分:0)

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