背景
我有一个 R
数据框 d
:
d <- data.frame(ID = c("a","a","b","b", "c","c","c"),
event = c(1,1,0,0,1,1,1),
event_date = as.Date(c("2011-01-01","2012-08-21","2011-12-23","2011-12-31","2013-03-14","2013-04-07","2014-07-14")),
stringsAsFactors=FALSE)
如您所见,ID
列中有 3 个不同的人,他们要么参加过,要么没有参加过事件
,并附有事件日期状态已记录 (event_date
)。
问题
我想创建一个新的变量/列,event_within_interval
,它将 1 分配给给定 ID
的所有单元格,如果该ID
在第一个事件
=1后的180天内发生了2个或更多事件
=1。
让我进一步解释一下:ID=a
和 ID=c
各有 2 个或更多事件,但只有 ID=c
有他们在第一次事件后 180 天内的第二次事件(因此,对于 ID=c
来说,2013 年 4 月 7 日 - 2013 年 3 月 14 日 = 24 天)。
问题是我不确定如何告诉 R
“如果第二个事件发生在第一个 event=1
后的 180 天内”。
我想要什么
这是我正在寻找的内容:
want <- data.frame(ID = c("a","a","b","b","c","c","c"),
event = c(1,1,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","2013-04-07","2014-07-14")),
event_within_interval = c(0,0,0,0,1,1,1),
stringsAsFactors=FALSE)
我尝试过的
到目前为止我才刚刚开始尝试:
d <- d %>%
mutate(event_within_interval = ID %in% if_else(d$event == 1, 1, 0))
但这并没有给我我想要的东西,因为如果你运行代码你就可以知道。
我已将其设置为 if_else
,但我不确定从这里开始到哪里。
更新:我编辑了两个可重现的示例(我所拥有的和我想要的),以强调所需的日期间隔必须位于第一个事件和第二个事件之间的事实,不是第一个事件和最后一个事件。 (一些用户使用 last
提交了示例,该示例适用于可重现示例的上一次迭代,但不适用于真实数据集。)
最佳答案
使用lubridate
和data.table
包怎么样?
library(data.table)
library(lubridate)
d <- data.frame(ID = c("a","a","b","b", "c","c"),
event = c(1,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","2013-04-07")),
stringsAsFactors=FALSE)
d <- data.table(d)
d <- d[, event_within_interval := 0]
timeInterval <- interval(start = "2013-03-14", end = "2013-04-07")
d <- d[event == 1 & event_date %within% timeInterval, event_within_interval := 1]
d
# ID event event_date event_within_interval
# 1: a 1 2011-01-01 0
# 2: a 1 2012-08-21 0
# 3: b 0 2011-12-23 0
# 4: b 0 2011-12-31 0
# 5: c 1 2013-03-14 1
# 6: c 1 2013-04-07 1
关于r - 在 R 中,使用日期范围内的事件计数创建变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71291901/