2016-11-30 1 views
2

Ich habe einen Datensatz mit IDs und Zuständen. Ich muss den maximalen Status in den letzten 4 Quartalen erhalten. Als Beispiel habe ich diese Tabelle:Wie erhalten Sie den höchsten Wert von ID in den letzten 4 Quartalen in r data.table?

library(data.table) 
library(zoo) 

DT = 
    data.table(id=c("1","1","1","1","1","1","1","1","2"), 
      date=as.yearqtr(c("2015Q1", "2014Q4", "2014Q3", "2014Q2", "2014Q1", "2013Q4","2013Q3","2013Q2","2015Q2")), 
      status=c(0,0,0,0,0,0,1,0,0)) 

Ich möchte den maximalen Wert für status in den letzten vier Viertel erhalten zur Verfügung:

DT = 
data.table(id=c("1","1","1","1","1","1","1","1","2"), 
      date=as.yearqtr(c("2015Q1", "2014Q4", "2014Q3", "2014Q2", "2014Q1","2013Q4","2013Q3","2013Q2","2015Q2")), 
      status=c(0,0,0,0,0,0,1,0,0), 
      Max_status=c(0,0,0,1,1,1,1,0,0)) 

Hat jemand eine Ahnung, dass ordentlich zu tun und schnell in data.table? Ich habe versucht, etwas wie folgt:

DT[,Date_1yPrior:=date-1] 
DT[,Max_Status:=max(status[date>=Date_1yPrior & date<=Date_1yPrior]),by='id'] 

aber die j und ich verweisen sind nicht korrekt. Ich würde eine data.table Lösung bevorzugen.

Vielen Dank im Voraus!

+0

was ist das func as.yearqtr()? Welches Paket? –

+0

@ joel.wilson hat gerade die Frage mit dem Paket geladen. '' zoo'' ist für as.yearqtr() – Milosz

Antwort

1

Ich denke, dies ist der Trick:

library(zoo) 
library(data.table) 
DT[, date_num := as.numeric(date)] 
DT[, NextStatus1Q := .SD[match(date_num - .25, .SD$date_num), status], by=id] 
DT[, NextStatus2Q := .SD[match(date_num - .5, .SD$date_num), status], by=id] 
DT[, NextStatus3Q := .SD[match(date_num - .75, .SD$date_num), status], by=id] 
DT[, NextStatus4Q := .SD[match(date_num - 1, .SD$date_num), status], by=id] 
DT[,MaxStatus:=max(NextStatus1Q,NextStatus2Q,NextStatus3Q,status,0,na.rm=T),by=c('id','date')] 
#DT[,MaxStatus:=max(NextStatus1Q,NextStatus2Q,NextStatus3Q,NextStatus4Q,status,0,na.rm=T),by=c('id','date')] # If you also want 4q (actually 5 quarters back) 

neue Spalten erstellen, in dem Sie den Wert vor 1-3 Quartalen Nachschlag und danach die max wählen.

3

Mit zoo::rollapplyr

DT[order(id, date), max_status:=rollapplyr(status, FUN=max, width=4, fill=0, partial=TRUE), id] 
DT 

# id date status max_status 
#1: 1 2015 Q1  0   0 
#2: 1 2014 Q4  0   0 
#3: 1 2014 Q3  0   0 
#4: 1 2014 Q2  0   1 
#5: 1 2014 Q1  0   1 
#6: 1 2013 Q4  0   1 
#7: 1 2013 Q3  1   1 
#8: 1 2013 Q2  0   0 
#9: 2 2015 Q2  0   0 
+1

Es sollte wirklich vom Datum abhängen, es könnte beispielsweise passieren, dass es Lücken in den Daten gibt und dann würde das nicht funktionieren, oder? – Milosz

+1

In diesem Fall füllen Sie die fehlenden Quartalsinstanzen aus. – ExperimenteR

Verwandte Themen