如何标记时间数据中的差距
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
我正在尝试创建一个标志来识别时间戳数据中超过 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