如何标记时间数据中的差距

How to flag gaps in time data

我正在尝试创建一个标志来识别时间戳数据中超过 2 天的差距。 This question almost accomplishes what I need 但我的时间数据在单个列中,而不是开始和结束列。另外,我正在使用 data.table。现在我正在尝试使用 diff() 但我认为这可能可以像链接问题中那样使用 lag() 来完成。

到目前为止我有这个:

library(data.table)

myID <- c(1,1,1,1,1,1,2,2,2,2,2,2)
BST <- c("2017-06-01 00:00:01", "2017-06-01 00:00:02",
         "2017-06-02 00:00:01", "2017-06-02 00:00:02", 
         "2017-06-03 00:00:01", "2017-06-03 00:00:02",
         "2017-06-01 00:00:01", "2017-06-01 00:00:02", 
         "2017-06-05 00:00:01", "2017-06-05 00:00:02", 
         "2017-06-09 00:00:01", "2017-06-09 00:00:02")
dt1 <- data.table(myID, BST)

# Create gapFlag
dt1 <- dt1[, gapFlag := lapply(.SD, function(x) which(as.duration(diff(dt1$BTS))/ddays(1) > 2)), by = myID]

但这似乎无休止地 运行...我的实际 data.table 超过 1000 万行。

我想要的结果如下所示(计算 gapCount 中的间隙的额外好处):

这是一个滞后的方法

dt1[, l_BST := shift(BST), by = myID]

然后您可以根据您对 "gap" 的定义来比较这两列(例如,两者之间 > 2 天,两者都没有 NA 值)。

如果您想使用 diff() 并保持在 data.table 内(即没有其他包),您也可以这样做:

dt1[, gapFlag := c(0, diff(as.Date(BST))) > 2, by = myID]
dt1[, GapCount := cumsum(gapFlag), by = myID]

这是另一种使用 diff 的方法,它也给出了 gapCount:

library(data.table)

dt1[, gapFlag := c(0, diff(as.Date(BST)))>2, by = myID][, gapCount := cumsum(gapFlag), by = myID]

结果:

    myID                 BST gapFlag gapCount
 1:    1 2017-06-01 00:00:01   FALSE        0
 2:    1 2017-06-01 00:00:02   FALSE        0
 3:    1 2017-06-02 00:00:01   FALSE        0
 4:    1 2017-06-02 00:00:02   FALSE        0
 5:    1 2017-06-03 00:00:01   FALSE        0
 6:    1 2017-06-03 00:00:02   FALSE        0
 7:    2 2017-06-01 00:00:01   FALSE        0
 8:    2 2017-06-01 00:00:02   FALSE        0
 9:    2 2017-06-05 00:00:01    TRUE        1
10:    2 2017-06-05 00:00:02   FALSE        1
11:    2 2017-06-09 00:00:01    TRUE        2
12:    2 2017-06-09 00:00:02   FALSE        2