我有一个纵向数据集,我想在其中创建一个列来指示过去两年中某个人是否发生过事件 (t-2
)。我创建了与我的数据集共享主要特征的玩具数据(参见下面的代码)。
set.seed(123)
df <- data.frame(id = sort(rep(1:10,5)),
time = rep(2011:2015, 10),
event = rbinom(50, 1, 0.2))
head(df,10)
# Output
id time event
1 1 2011 0
2 1 2012 0
3 1 2013 0
4 1 2014 1
5 1 2015 1
6 2 2011 0
7 2 2012 0
8 2 2013 1
9 2 2014 0
10 2 2015 0
在此数据中,我想创建一个新列 occurred
以指示该事件是否在过去两年内发生。对于前 10 行,这将导致数据如下所示:
id time event occured
1 1 2011 0 0
2 1 2012 0 0
3 1 2013 0 0
4 1 2014 1 1
5 1 2015 1 1
6 2 2011 0 0
7 2 2012 0 0
8 2 2013 1 1
9 2 2014 0 1
10 2 2015 0 1
在最理想的情况下,我希望倒退的年数成为一个可以更改的参数(即,使构造 occurred
变得相对容易,以便指示事件是否发生发生在过去 1 年或过去 4 年)。
谢谢!
最佳答案
data.table
方法
假设您的数据中没有缺失的年份。所以所有年份 2011:2015 要么是 0 要么是 1。
library(data.table)
# make it a data.table
setDT(df)
#
df[, occured := as.numeric(
frollsum(event, n = 3, align = "right", fill = event[1]) > 0),
by = .(id)]
# id time event occured
# 1: 1 2011 0 0
# 2: 1 2012 0 0
# 3: 1 2013 0 0
# 4: 1 2014 1 1
# 5: 1 2015 1 1
# 6: 2 2011 0 0
# 7: 2 2012 0 0
# 8: 2 2013 1 1
# 9: 2 2014 0 1
#10: 2 2015 0 1
#11: 3 2011 1 1
#12: 3 2012 0 1
#13: 3 2013 0 1
#14: 3 2014 0 0
#15: 3 2015 0 0
#16: 4 2011 1 1
#17: 4 2012 0 1
#18: 4 2013 0 1
#19: 4 2014 0 0
#20: 4 2015 1 1
# ...
https://stackoverflow.com/questions/71737356/