Ich habe eine data.table
mit vielen Ereignissen für verschiedene Kunden ("clients") und möchte die Ereignisse an jeder Lücke teilen ("fehlendes Ereignis") desselben Kunden.Gruppendaten.Tabelle Daten in Gruppen von aufeinanderfolgenden Zeitintervallen (geteilt durch Lücken)
E. g. Ich nehme an monatliche Ereignisdaten und ein fehlendes Ereignis für einen oder mehr Monate habe, ist eine „Lücke“, während Ereignisse für mehr aufeinanderfolgende Monate zur gleichen Gruppe gehören:
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))
Mit 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
Das Ergebnis soll eine Gruppennummer sein, die für jede Reihe derselben Gruppe gleich ist, e. 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
Es ist nicht erforderlich, dass die Gruppennummer für jeden Client auf eins zurückgesetzt wird (wäre aber nett).
Sie können davon ausgehen, dass die Ereignisse in jedem Client geordnet sind und keine doppelten Ereignisdaten im selben Client vorhanden sind.
Vielleicht 'dt [, Gruppe: = cumsum (c (TRUE, diff (event.date)> 31)), durch = client.no] '. Beachten Sie, dass Sie in einer Zeile nicht die Einheiten steuern können, die von 'diff' an ein' POSIXt'-Objekt zurückgegeben werden. Daher müssen Sie wahrscheinlich überprüfen, ob die Einheit "Tage" ist und dann die Bedingung> 31 setzen. – nicola
Ausgezeichnete Lösung (was für ein Jammer, dass ich es hier nicht mehr abstimmen kann, ohne eine Antwort zu haben). DANKE! –