有条件地对列值 = 1 和第一个日期条件的唯一 ID 进行采样

Conditionally sample unique IDs on column value = 1 and first date condition

背景

我有一个数据集d:

d <- data.frame(ID = c("a","a","b","b", "c","c"),
                event = c(0,1,0,0,1,1),
                event_date = as.Date(c("2011-01-01","2012-08-21","2011-12-23","2011-12-31","2013-03-14","2015-07-12")),
                entry_date = as.Date(c("2009-01-01","2009-01-01","2011-09-12","2011-09-12","2005-03-01","2005-03-01")),
                stringsAsFactors=FALSE)

看起来像这样:

如您所见,其中有 3 个 ID,指示他们是否有 event、该事件的日期以及他们进入的日期数据集。

问题

我想对数据集中的 ID 进行一些抽样。具体来说,我想对满足以下两个条件的任何不同 ID 的所有行进行采样:

  1. 任何 event=1
  2. 他们第一个(按时间顺序最早)event_date 行的日期距离他们 entry_date.
  3. 超过 365 天但不到 1095 天(3 年)

想要的结果

如果您查看 3 个 ID 中的每一个,您会发现只有 ID= a 符合这两个条件:此人在他们的第二个事件记录中有一个 event=1,并且他们的第一个事件记录的日期是从他们的 entry_date 开始的 1 到 3 年之间(2011-01-01 从他们的输入日期开始正好两年).

所以,我想要一个如下所示的数据框:

我试过的

我已经完成一半了:我已经设法让代码满足我的第一个标准,但不符合第二个标准。看看:

d_esired <- subset(d, ID %in% sample(unique(ID[event == 1]), 1))

如何添加第二个条件?

使用data.table我们可以识别那些ID,然后子集

library(data.table)
setDT(d)

d[ID %in% 
  (d[, any(event==1 & any(event_date>(365+entry_date) & event_date<(1095+entry_date))), by=ID][V1==TRUE, ID])]

any(event_date>(365+entry_date) 测试任何行中的有效日期(事件可以是 0 或 1),any(event==1 & ...) 测试是否发生了事件以及事件是否在任何时候发生。用于 return ID 值的向量。 %in% 运算符然后测试 d 中的 ID 是否在该向量中。