我有一个类似于下面的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))
答案 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