2017-06-08 19 views
1

Angenommen, der Datensatz drei SpaltenSAS-Einsatz von Blei Funktion

Date Region Price 
01-03 A  1 
01-03 A  2 
01-03 B  3 
01-03 B  4 
01-03 A  5 
01-04 B  4 
01-04 B  6 
01-04 B  7 

Ich versuche, hat die Führung Preis nach Datum und Region durch folgenden Code zu erhalten.

data want; 
set have; 
by _ric date_l_; 
do until (eof); 
set have(firstobs=2 keep=price rename=(price=lagprice)) end=eof; 
end; 
if last.date_l_ then call missing(lagprice); 
run; 

Allerdings haben die WANT nur eine Beobachtung. Dann new_date=date ich erstellen und versuchen Sie einen anderen Code:

data want; 
set have nobs=nobs; 
    do _i = _n_ to nobs until (new_date ne Date); 
    if eof1=0 then 
    set have (firstobs=2 keep=price rename=(price=leadprice)) end=eof1; 
    else leadprice=.; 
    end; 
run; 

Mit diesem Code wird SAS arbeitet nur langsam. Also ich denke, dass dieser Code auch nicht angemessen ist. Könnte jemand Vorschläge machen? Danke

Antwort

2

Versuchen durch die Variablen Sortierung Sie führen Preis dann zweimal zusammen gesetzt:

data test; 
length Date Region $12 Price 8 ; 
input Date $ Region $ Price ; 
datalines; 
    01-03 A  1 
    01-03 A  2 
    01-03 B  3 
    01-03 B  4 
    01-03 A  5 
    01-04 B  4 
    01-04 B  6 
    01-04 B  7 
    ; 
run; 

** sort by vars you want lead price for **; 
proc sort data = test; 
    by DATE REGION; 
run; 

** set together twice -- once for lead price and once for all variables **; 
data lead_price; 
    set test; 
    by DATE REGION; 
    set test (firstobs = 2 keep = PRICE rename = (PRICE = LEAD_PRICE)) 
     test (obs = 1 drop = _ALL_); 
    if last.DATE or last.REGION then do; 
     LEAD_PRICE = .; 
    end; 
run; 
0

Sie können proc expand verwenden, um Leads für numerische Variablen nach Gruppe zu generieren. Versuchen Sie folgendes statt:

Schritt 1: Sortieren nach Region, Datum

proc sort data=have; 
    by Region Date; 
run; 

Schritt 2: Erstellen Sie einen neuen ID-Variable bezeichnen Beobachtung Zahlen

Da Sie mehrere Werte haben pro Datum pro Region müssen wir eine neue ID-Variable generieren, so dass proc expandlead nach Beobachtungsnummer und nicht nach date verwendet.

data have2; 
    set have; 

    _ID_ = _N_; 
run; 

Schritt 3: Führen Sie proc expand nach Region mit der lead Transformation

lead wird genau das tun, wie es klingt. Sie können um beliebig viele Werte führen, solange die Daten dies unterstützen. In diesem Fall führen wir durch eine Beobachtung.

proc expand data=have2 
      out=want; 
    by Region; 
    id _ID_; 
    convert Price = Lead_Price/transform=(lead 1) ; 
run; 
Verwandte Themen