【发布时间】: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)>31)),by=client.no]。请记住,您无法在一行中控制diff返回的单位应用于POSIXt对象,因此您可能必须检查单位是否为days,然后设置>31条件。 -
优秀的解决方案(很遗憾,我无法在没有答案的情况下在这里投票更多)。谢了!
标签: r data.table time-series