有条件地对列值 = 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
的所有行进行采样:
- 有任何
event
=1
- 他们第一个(按时间顺序最早)
event_date
行的日期距离他们 entry_date
. 超过 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 是否在该向量中。
背景
我有一个数据集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
的所有行进行采样:
- 有任何
event
=1 - 他们第一个(按时间顺序最早)
event_date
行的日期距离他们entry_date
. 超过 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 是否在该向量中。