R 统计data.table中事件发生后的天数

R 统计data.table中事件发生后的天数,r,date,data.table,R,Date,Data.table,我们可以使用zoo中的na.locf创建一个新的日期列,其中count>0的最后一天的日期向下填充,并取该列的lag,因为如果给定日期本身具有count>0,我们不希望返回0天。相反,我们要从上一个非零日期开始计算天数。最后,我们找到date和date2之间的difftime: c(NA, 1, 2, 4, 1, 1, 1, 1, 1, 2, 5, 6, 9, 10, 2, 3, NA, NA, 2, 2, 3, 1, 2, 1, 1, 2, 5, 1, 4, 1, 2, 3) 结果: lib

我们可以使用
zoo
中的
na.locf
创建一个新的日期列,其中
count>0
的最后一天的日期向下填充,并取该列的
lag
,因为如果给定日期本身具有
count>0
,我们不希望返回0天。相反,我们要从上一个非零日期开始计算天数。最后,我们找到
date
date2
之间的
difftime

c(NA, 1, 2, 4, 1, 1, 1, 1, 1, 2, 5, 6, 9, 10, 2, 3, NA, NA, 2, 2, 3, 1, 2, 1, 1, 2, 5, 1, 4, 1, 2, 3)
结果:

library(data.table)
library(zoo)

dt[,count2 := difftime(date, na.locf(lag(ifelse(count > 0, date, NA)), na.rm = FALSE)), by = id]
library(data.table)
library(zoo)

dt[,count2 := difftime(date, na.locf(lag(ifelse(count > 0, date, NA)), na.rm = FALSE)), by = id]
      id       date count  count2
 1: 0151 2011-08-09     7 NA days
 2: 0151 2011-08-10     1  1 days
 3: 0151 2011-08-12     0  2 days
 4: 0151 2011-08-14     4  4 days
 5: 0151 2011-08-15     1  1 days
 6: 0151 2011-08-16     4  1 days
 7: 0151 2011-08-17     2  1 days
 8: 0151 2011-08-18     1  1 days
 9: 0151 2011-08-19     0  1 days
10: 0151 2011-08-20     0  2 days
11: 0151 2011-08-23     0  5 days
12: 0151 2011-08-24     0  6 days
13: 0151 2011-08-27     0  9 days
14: 0151 2011-08-28     1 10 days
15: 0151 2011-08-30     0  2 days
16: 0151 2011-08-31     1  3 days
17: 4615 2011-08-09     0 NA days
18: 4615 2011-08-10     1 NA days
19: 4615 2011-08-12     3  2 days
20: 4615 2011-08-14     0  2 days
21: 4615 2011-08-15     1  3 days
22: 4615 2011-08-16     0  1 days
23: 4615 2011-08-17     5  2 days
24: 4615 2011-08-18     1  1 days
25: 4615 2011-08-19     0  1 days
26: 4615 2011-08-20     0  2 days
27: 4615 2011-08-23     5  5 days
28: 4615 2011-08-24     0  1 days
29: 4615 2011-08-27     1  4 days
30: 4615 2011-08-28     2  1 days
31: 4615 2011-08-30     0  2 days
32: 4615 2011-08-31     1  3 days
      id       date count  count2