2017-05-04 2 views
1

I haben einen unsymmetrischen Längs-Datensatz store_data zu erzeugen:SAS Macro mehrere lags an Längsdaten

Period Store  Sales 
Jan  A   12 
Feb  A   10 
March  A   8 
April  A   3 
Jan  B   5 
Feb  B   19 
March  B   7 
April  B   8 
Jan  C   5 
Feb  C   19 
March  C   7 
April  C   8 

Derzeit, um die Abgabe zu erstellen nacheilt von bis zu 2 Jahren habe ich die Verzögerung für manuell erstellen jede Bestellung. I.e.

data Store_lag; 
    set Store_data; 
    by Store; 

    Sales_Lag1=lag(Sales); 
    if first.Store then Sales_Lag1=.; 

    Sales_Lag2=lag(Sales_Lag1); 
    if first.Store then Sales_Lag2=.; 

    *etc.....; 
run; 

Meine Frage wäre, wenn es ein Makro zum Erstellen solcher Variablen gibt? Es wird besonders mühsam, wenn die Anzahl der Verzögerungsreihenfolgen groß wird.

+0

Haben Sie SAS/ETS lizensiert (Zeitreihe)? – Joe

+0

Nein. Ich weiß, dass wir proc in ETS erweitern können, aber ich habe nur SAS base/STAT installiert. – user90831

+0

Wow ein gültiger Anwendungsfall für die Verzögerungsfunktion! =) –

Antwort

3

Array Verarbeitung sollte wirklich hier nur gut tun. Hier ist ein Beispiel.

data want; 
    set have; 
    by store; 

    array lags[1:4] lags0-lags3; 
    retain lags:; 

    if first.store then 
    call missing(of lags[*]); *clear out the array for each store; 
    do _i = dim(lags) to 2 by -1; *move the stack to the right; 
    lags[_i] = lags[_i-1]; 
    end; 
    lags[1] = sales;    *set the first one; 
    drop lags0;      *lags0 is the current sales, of course; 
run;