在 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'变量创建一个diffcumsum的分组变量,然后分配(:=)对应于[=的第一个实例的'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