如何分别标记所有组记录?
How to label all group records separately?
所以我记录了每个人在每家商店的发现时间,我想根据时差 5 分钟或新商店 ID 对组进行不同的标记。数据如下所示:
DT1<-data.table(
id=c(1,1,1,1,1,1,1,1),
in_time=c("2017-11-01 08:37:35","2017-11-01 08:38:42","2017-11-01 08:39:45","2017-11-01 08:50:35","2017-11-01 08:51:35","2017-11-01 08:52:44","2017-11-01 08:53:16","2017-11-01 08:59:29"),
store_id=c(1,1,1,1,1,2,2,2)
)
DT1[,in_time:=ymd_hms(in_time)]
然后我使用下面的代码来分隔每个组。
DT1[,group:= cumsum(difftime(in_time, shift(in_time, fill=-Inf), units="mins") > 5), by=list(id,store_id)]
但后来我又用同一个 ID 得到了同一个组。有什么方法可以为不同的组获取不同的组 ID(您可以看到组 1 在 2017-11-01 08:52:44 再次重复)。
另外,我有多个 id,所以我按 id 和 store id 分组。
感谢任何帮助。
您可以尝试使用 rleid
获取唯一索引并在其中包含 store_id
。
library(data.table)
DT1[, group := rleid(store_id, cumsum(difftime(in_time,
shift(in_time, fill = first(in_time)), units = "mins") > 5)), id]
DT1
# id in_time store_id group
#1: 1 2017-11-01 08:37:35 1 1
#2: 1 2017-11-01 08:38:42 1 1
#3: 1 2017-11-01 08:39:45 1 1
#4: 1 2017-11-01 08:50:35 1 2
#5: 1 2017-11-01 08:51:35 1 2
#6: 1 2017-11-01 08:52:44 2 3
#7: 1 2017-11-01 08:53:16 2 3
#8: 1 2017-11-01 08:59:29 2 4
所以我记录了每个人在每家商店的发现时间,我想根据时差 5 分钟或新商店 ID 对组进行不同的标记。数据如下所示:
DT1<-data.table(
id=c(1,1,1,1,1,1,1,1),
in_time=c("2017-11-01 08:37:35","2017-11-01 08:38:42","2017-11-01 08:39:45","2017-11-01 08:50:35","2017-11-01 08:51:35","2017-11-01 08:52:44","2017-11-01 08:53:16","2017-11-01 08:59:29"),
store_id=c(1,1,1,1,1,2,2,2)
)
DT1[,in_time:=ymd_hms(in_time)]
然后我使用下面的代码来分隔每个组。
DT1[,group:= cumsum(difftime(in_time, shift(in_time, fill=-Inf), units="mins") > 5), by=list(id,store_id)]
但后来我又用同一个 ID 得到了同一个组。有什么方法可以为不同的组获取不同的组 ID(您可以看到组 1 在 2017-11-01 08:52:44 再次重复)。 另外,我有多个 id,所以我按 id 和 store id 分组。
感谢任何帮助。
您可以尝试使用 rleid
获取唯一索引并在其中包含 store_id
。
library(data.table)
DT1[, group := rleid(store_id, cumsum(difftime(in_time,
shift(in_time, fill = first(in_time)), units = "mins") > 5)), id]
DT1
# id in_time store_id group
#1: 1 2017-11-01 08:37:35 1 1
#2: 1 2017-11-01 08:38:42 1 1
#3: 1 2017-11-01 08:39:45 1 1
#4: 1 2017-11-01 08:50:35 1 2
#5: 1 2017-11-01 08:51:35 1 2
#6: 1 2017-11-01 08:52:44 2 3
#7: 1 2017-11-01 08:53:16 2 3
#8: 1 2017-11-01 08:59:29 2 4