你的问题很难理解。一些示例将大大有助于清除您正在尝试做的事情。
这是我的理解:您想将tbl1 中的id 与tbl2 进行比较。如果 id 匹配,您想知道来自tbl1 的date 介于start 和来自tbl2 的end 之间的频率。
首先,我将创建一些假数据。
library(tidyverse)
tbl1 <- tribble(
~id, ~date,
1, "2018-01-01",
2, "2018-01-01",
3, "2018-01-01",
5, "2018-01-01"
) %>%
mutate(date = as.Date(date))
tbl2 <- tribble(
~id, ~start, ~end,
1, "2017-01-01", "2019-01-01",
1, "2016-01-01", "2019-01-01",
1, "2015-01-01", "2019-01-01",
2, "2017-01-01", "2019-01-01",
2, "2019-01-01", "2020-01-01",
3, "2019-01-01", "2020-01-01",
4, "2019-01-01", "202o-01-01"
) %>%
mutate(start = as.Date(start),
end = as.Date(end))
我们应该发现 ID 1 在范围内 3 次,ID 2 在范围内一次,ID 3 在范围内零次。我们将从 tbl1 中删除 id 5,因为它不在 tbl2 中,我们将忽略 ID 4,因为它不在 tbl1 中。
这可以通过几个步骤来完成。首先我们使用inner_join 只保留匹配的ID。然后我们判断日期是否为in_range,最后,对于每个id,我们计算日期为in_range的次数。
tbl3 <- tbl1 %>%
inner_join(tbl2, by = "id") %>%
mutate(in_range = date > start & date < end) %>%
group_by(id) %>%
summarize(count = sum(in_range))