【问题标题】:Group data.table dates into groups by consecutive time intervals (split by gaps)按连续时间间隔将 data.table 日期分组(按间隔划分)
【发布时间】:2016-10-06 14:14:22
【问题描述】:

我有一个data.table,其中包含针对不同客户(“客户”)的许多事件,并且希望在同一客户的每个间隙(“缺失事件”)处拆分事件

E. G。假设我有每月的事件数据,一个或多个月的缺失事件是一个“差距”,而连续几个月的事件属于同一组:

library(data.table)
library(lubridate)   # for ymd()
dt <- data.table(client.no = c(rep("Client_A", 3), rep("Client_B", 5), rep("Client_C", 2)),
                 event.date = ymd(20160101, 20160201, 20160301, 20151201, 20160101, 20160301, 20160501, 20160601, 20140701, 20150101))

dt

    client.no event.date
 1:  Client_A 2016-01-01
 2:  Client_A 2016-02-01
 3:  Client_A 2016-03-01
 4:  Client_B 2015-12-01
 5:  Client_B 2016-01-01
 6:  Client_B 2016-03-01
 7:  Client_B 2016-05-01
 8:  Client_B 2016-06-01
 9:  Client_C 2014-07-01
10:  Client_C 2015-01-01

结果应该是同一组的每一行都相同的组号,例如。 g.:

    client.no event.date group.no
 1:  Client_A 2016-01-01        1
 2:  Client_A 2016-02-01        1
 3:  Client_A 2016-03-01        1
 4:  Client_B 2015-12-01        1
 5:  Client_B 2016-01-01        1
 6:  Client_B 2016-03-01        2
 7:  Client_B 2016-05-01        3
 8:  Client_B 2016-06-01        3
 9:  Client_C 2014-07-01        1
10:  Client_C 2015-01-01        2

不需要为每个客户端将组号重置为一个(但会很好)。

您可以假设事件在每个客户端中都是有序的,并且同一客户端中没有重复的事件日期。

【问题讨论】:

  • 也许是dt[,group:=cumsum(c(TRUE,diff(event.date)&gt;31)),by=client.no]。请记住,您无法在一行中控制diff 返回的单位应用于POSIXt 对象,因此您可能必须检查单位是否为days,然后设置&gt;31 条件。
  • 优秀的解决方案(很遗憾,我无法在没有答案的情况下在这里投票更多)。谢了!

标签: r data.table time-series


【解决方案1】:

你可以使用cumsum:

dt[,z:=cumsum(c(1,diff(event.date)>31)),by=client.no]

输出:

   client.no event.date z
 1:  Client_A 2016-01-01 1
 2:  Client_A 2016-02-01 1
 3:  Client_A 2016-03-01 1
 4:  Client_B 2015-12-01 1
 5:  Client_B 2016-01-01 1
 6:  Client_B 2016-03-01 2
 7:  Client_B 2016-05-01 3
 8:  Client_B 2016-06-01 3
 9:  Client_C 2014-07-01 1
10:  Client_C 2015-01-01 2

【讨论】:

  • 我同时在 cmets 中建议的同一行 :) 当然 +1(也许添加有关单位的警告)。
猜你喜欢
  • 2015-03-01
  • 2021-02-25
  • 1970-01-01
  • 2011-12-20
  • 2011-02-08
  • 2019-06-28
  • 2018-10-12
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多