2016-06-28 10 views
2

Wir werden mit der folgenden Datentabelle starten:auf Daten basierend erstellen Ranking (Quartal) in R

id  date 
1: 1 2016-03-31 
2: 1 2015-12-31 
3: 1 2015-09-30 
4: 1 2015-06-30 
5: 1 2015-03-31 
6: 2 2016-03-31 
7: 2 2015-09-30 
8: 2 2015-06-30 
9: 2 2015-03-31 
10: 2 2014-12-31 

library(data.table) 
DT <- data.table(c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2), 
       as.IDate(c("2016-03-31", "2015-12-31", "2015-09-30", "2015-06-30", 
        "2015-03-31", "2016-03-31", "2015-09-30", "2015-06-30", 
        "2015-03-31", "2014-12-31"))) 
setnames(DT, c("id", "date")) 

Für jede eindeutige ID, ich will einen Ranking erstellen. Das aktuellste Datum für eine bestimmte ID sollte den Rang 0 haben. Danach sollte ich 3 Monate von diesem Datum entfernen (ich denke nicht über Tage nach), um das Datum des Rangs -1 zu erhalten. Ich muss das bis zum 19. Rang wiederholen. Nachdem ich eine neue Spalte hinzugefügt habe, die den Rang enthält.

Die endgültige Ausgabe so aussehen würde (Achten Sie auf die Rangliste von id = 2):

id  date rank_year 
1: 1 2016-03-31   0 
2: 1 2015-12-31  -1 
3: 1 2015-09-30  -2 
4: 1 2015-06-30  -3 
5: 1 2015-03-31  -4 
6: 2 2016-03-31   0 
7: 2 2015-09-30  -2 
8: 2 2015-06-30  -3 
9: 2 2015-03-31  -4 
10: 2 2014-12-31  -5 

Antwort

5

ich tun würde (borgen order von @ akrun Antwort):

DT[order(-date), rank_year := { 
    z = month(date) + year(date)*12 
    as.integer((z - z[1L])/3) 
}, by=id] 

    id  date rank_year 
1: 1 2016-03-31   0 
2: 1 2015-12-31  -1 
3: 1 2015-09-30  -2 
4: 1 2015-06-30  -3 
5: 1 2015-03-31  -4 
6: 2 2016-03-31   0 
7: 2 2015-09-30  -2 
8: 2 2015-06-30  -3 
9: 2 2015-03-31  -4 
10: 2 2014-12-31  -5 
+0

Vielen Dank! In meinem Fall muss ich 'DT [order (id, -date)]' wie von @akrun vorgeschlagen hinzufügen. Ich denke, Ihre Lösung basiert auf dem ersten Datum einer bestimmten ID. – Alexis

+0

@Alexis Ok, für diesen Fall bearbeitet. – Frank

+0

Ich verstehe den Schnitt nicht wirklich. Können Sie für das neue Beispiel mit der gewünschten Ausgabe dput geben? Wenn es zu stark von Ihrer ursprünglichen Frage abweicht, könnten Sie es als eine neue Aufgabe betrachten. – Frank

1

Wir kann auch tun

DT[order(id, -date)][, rank_year := 
      -1*c(0,cumsum(as.numeric(abs(diff(date)))))%/%90 , by = id][] 
# id  date rank_year 
#1: 1 2016-03-31   0 
#2: 1 2015-12-31  -1 
#3: 1 2015-09-30  -2 
#4: 1 2015-06-30  -3 
#5: 1 2015-03-31  -4 
#6: 2 2016-03-31   0 
#7: 2 2015-09-30  -2 
#8: 2 2015-06-30  -3 
#9: 2 2015-03-31  -4 
#10: 2 2014-12-31  -5 
Verwandte Themen