2016-07-28 5 views
0

Ich muss Max (Measure) in den letzten 3 Monaten für jede ID und Monat berechnen, ohne PROC SQL.Ich habe mich gefragt, ob ich dies mit der RETAIN-Anweisung tun könnte, aber ich habe keine Ahnung wie man die Bedingung des Vergleichs des Wertes von Measure in der aktuellen Zeile und den vorhergehenden zwei implementiert.SAS Höchstwert in vorhergehenden Zeilen

Ich muss auch die oben genannten für mehr als 3 Monate vorbereiten, so dass jede Lösung, die keinen separaten Schritt für jeden weiteren Monat erfordern würde absolut geschätzt werden! Hier

die Daten die ich habe:

data have; 
input month ID $ measure; 
cards; 
201501 A 0 
201502 A 30 
201503 A 60 
201504 A 90 
201505 A 0 
201506 A 0 
201501 B 0 
201502 B 30 
201503 B 0 
201504 B 30 
201505 B 60 
; 

hier das, was ich brauche:

data want; 
input month ID $ measure max_measure_3m; 
cards; 
201501 A 0 0 
201502 A 30 30 
201503 A 60 60 
201504 A 90 90 
201505 A 0 90 
201506 A 0 90 
201501 B 0 0 
201502 B 30 30 
201503 B 0 30 
201504 B 30 30 
201505 B 60 60 
; 

And here both tables: the one I have on the left and the one I need on the right

+0

Post, was Sie ausprobiert haben bitte. – Reeza

+0

'proc expand daten = haben out = will method = none; nach ID; ID Monat; konvertieren measure = measure_max3/transformout = (MOVMAX 3); laufen; ' – Aga

Antwort

1

Sie dies tun können mit einem Array Das ist die Größe Ihres bewegten Fensters. Ich bin mir nicht sicher, welche Art von dynamischem Code in Bezug auf Windows benötigt wird. Wenn Sie den Höchstwert für 4 oder 5 Monate zusätzlich zu 3 Monaten benötigen, würde ich anstelle dieser Methoden die Verwendung von PROC EXPAND empfehlen. Die Dokumentation für PROC EXPAND hat ein gutes Beispiel dafür.

data want; 
    set have; 
    by id; 
    array _prev(0:2) _temporary_; 

    if first.id then 
     do; 
      call missing (of _prev(*)); 
      count=0; 
     end; 
    count+1; 
    _prev(mod(count, 3))=measure; 
    max=max(of _prev(*)); 
    drop count; 
run; 

proc expand data=test out=out method=none; 
    by id; 
    id month; 

    convert x = x_movave3/transformout=(movave 3); 
    convert x = x_movave4/transformout=(movave 4); 
run; 
+0

Ich verwendete PROC EXPAND und transformout movmax und ich bin mir ziemlich sicher, dass es meinen Tag :) gemacht hat. Danke vielmals! – Aga

+0

'proc expand daten = haben out = will method = none; nach ID; ID Monat; konvertieren measure = measure_max3/transformout = (MOVMAX 3); laufen; ' – Aga

0

Try this:

data want(drop=l1 l2 cnt tmp); 
set have; 
by id; 
retain cnt max_measure_3m l1 l2; 

if first.id then do; 
    max_measure_3m = 0; 
    cnt = 0; 
    l1 = .; 
    l2 = .; 
end; 

cnt = cnt + 1; 

tmp = lag(measure); 
if cnt > 1 then 
    l1 = tmp; 

tmp = lag2(measure); 
if cnt > 2 then 
    l2 = tmp; 

if measure > l1 and measure > l2 then 
    max_measure_3m = measure; 
run;