【问题标题】:How to label all group records separately?如何分别标记所有组记录?
【发布时间】:2020-06-02 03:28:29
【问题描述】:

所以我记录了每个商店中每个人的发现时间,我想根据时滞为 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(您可以在 2017-11-01 08:52:44 看到第 1 组再次重复)。 另外,我有多个 id,所以我按 id 分组并存储 id。

感谢任何帮助。

【问题讨论】:

  • 1) DT1 未准确生成。 in_timestore_idid 短。 2)你能展示你的预期输出吗?
  • @RonakShah 抱歉更新了数据表。

标签: r dplyr data.table shift


【解决方案1】:

您可以尝试使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多