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

时间:2018-06-07 19:20:28

标签: r data.table lubridate

我正在尝试创建一个标志,用于识别超过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中的差距时有额外的好处):

enter image description here

2 个答案:

答案 0 :(得分:1)

这是一种滞后的方法

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

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

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

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

答案 1 :(得分:1)

以下是使用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