在 data.table 中定义标志事件的开始日期
Defining start date of flag event in a data.table
我有一个 data.table
像下面这样有很多 ID:
ID Date Flag
1 2016.01.01 0
1 2016.02.01 0
1 2016.03.01 0
1 2016.04.01 1
1 2016.05.01 1
1 2016.06.01 1
1 2016.07.01 0
1 2016.08.01 0
1 2016.09.01 1
1 2016.10.01 1
1 2016.11.01 1
1 2016.12.01 0
1 2017.01.01 0
1 2017.02.01 0
我想定义一个基于标志的日期变量,逻辑如下(日期应该显示下一个或当前有效标志事件的开始日期:
ID Date Flag Date_of_flag_event
1 2016.01.01 0 2016.04.01
1 2016.02.01 0 2016.04.01
1 2016.03.01 0 2016.04.01
1 2016.04.01 1 2016.04.01
1 2016.05.01 1 2016.04.01
1 2016.06.01 1 2016.04.01
1 2016.07.01 0 2016.09.01
1 2016.08.01 0 2016.09.01
1 2016.09.01 1 2016.09.01
1 2016.10.01 1 2016.09.01
1 2016.11.01 1 2016.09.01
1 2016.12.01 0 NA
1 2017.01.01 0 NA
1 2017.02.01 0 NA
请帮我解决这个变量
提前致谢
这是一种选择。基于'Flag'变量创建一个diff
和cumsum
的分组变量,然后分配(:=
)对应于[=的第一个实例的'Date' 16=] 是 1 作为 'Date_of_flag_event'
dt1[, Date_of_flag_event := Date[which(Flag == 1)[1]], cumsum(c(TRUE, diff(Flag) < 0))]
dt1
# ID Date Flag Date_of_flag_event
# 1: 1 2016.01.01 0 2016.04.01
# 2: 1 2016.02.01 0 2016.04.01
# 3: 1 2016.03.01 0 2016.04.01
# 4: 1 2016.04.01 1 2016.04.01
# 5: 1 2016.05.01 1 2016.04.01
# 6: 1 2016.06.01 1 2016.04.01
# 7: 1 2016.07.01 0 2016.09.01
# 8: 1 2016.08.01 0 2016.09.01
# 9: 1 2016.09.01 1 2016.09.01
#10: 1 2016.10.01 1 2016.09.01
#11: 1 2016.11.01 1 2016.09.01
#12: 1 2016.12.01 0 NA
#13: 1 2017.01.01 0 NA
#14: 1 2017.02.01 0 NA
我有一个 data.table
像下面这样有很多 ID:
ID Date Flag
1 2016.01.01 0
1 2016.02.01 0
1 2016.03.01 0
1 2016.04.01 1
1 2016.05.01 1
1 2016.06.01 1
1 2016.07.01 0
1 2016.08.01 0
1 2016.09.01 1
1 2016.10.01 1
1 2016.11.01 1
1 2016.12.01 0
1 2017.01.01 0
1 2017.02.01 0
我想定义一个基于标志的日期变量,逻辑如下(日期应该显示下一个或当前有效标志事件的开始日期:
ID Date Flag Date_of_flag_event
1 2016.01.01 0 2016.04.01
1 2016.02.01 0 2016.04.01
1 2016.03.01 0 2016.04.01
1 2016.04.01 1 2016.04.01
1 2016.05.01 1 2016.04.01
1 2016.06.01 1 2016.04.01
1 2016.07.01 0 2016.09.01
1 2016.08.01 0 2016.09.01
1 2016.09.01 1 2016.09.01
1 2016.10.01 1 2016.09.01
1 2016.11.01 1 2016.09.01
1 2016.12.01 0 NA
1 2017.01.01 0 NA
1 2017.02.01 0 NA
请帮我解决这个变量
提前致谢
这是一种选择。基于'Flag'变量创建一个diff
和cumsum
的分组变量,然后分配(:=
)对应于[=的第一个实例的'Date' 16=] 是 1 作为 'Date_of_flag_event'
dt1[, Date_of_flag_event := Date[which(Flag == 1)[1]], cumsum(c(TRUE, diff(Flag) < 0))]
dt1
# ID Date Flag Date_of_flag_event
# 1: 1 2016.01.01 0 2016.04.01
# 2: 1 2016.02.01 0 2016.04.01
# 3: 1 2016.03.01 0 2016.04.01
# 4: 1 2016.04.01 1 2016.04.01
# 5: 1 2016.05.01 1 2016.04.01
# 6: 1 2016.06.01 1 2016.04.01
# 7: 1 2016.07.01 0 2016.09.01
# 8: 1 2016.08.01 0 2016.09.01
# 9: 1 2016.09.01 1 2016.09.01
#10: 1 2016.10.01 1 2016.09.01
#11: 1 2016.11.01 1 2016.09.01
#12: 1 2016.12.01 0 NA
#13: 1 2017.01.01 0 NA
#14: 1 2017.02.01 0 NA