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