2017-09-06 3 views
0

Ich versuche, eine neue Variable zu erstellen, die den nächsten Wert in einer Gruppe übernimmt. Insbesondere habe ich:Nächster Wert nach Gruppe in SAS

User Quarter 
A  2012Q1 
A  2012Q2 
A  2012Q3 

Meine gewünschte Ausgabe wäre:

User Quarter Next_Quarter 
A  2012Q1 2012Q2 
A  2012Q2 2012Q3 
A  2012Q3  n/a 

ich einen Zähler für jeden Kunden zu haben, haben versucht, aber ich bin nicht sicher, wo ich von dort gehen sollte ..

Antwort

0

Es gibt keine einfache Möglichkeit, in einem Datenschritt nach vorne zu schauen. Sie können die Reihenfolge umkehren, die Verzögerungsfunktion verwenden, um den Wert zu erhalten, und die Reihenfolge entsprechend ändern.

data have; 
input User $ Quarter $; 
datalines; 
A  2012Q1 
A  2012Q2 
A  2012Q3 
B  2012Q1 
B  2012Q2 
B  2012Q3 
; 

/*Reverse the order*/ 
proc sort data=have; 
by user descending quarter; 
run; 

/*Use Lag() to get the previous value (next since we reversed it)*/ 
data want; 
set have; 
by user; 

tmp = lag(quarter); 

if ^first.user then 
    Next_Quarter = tmp; 
else 
    Next_Quarter = "n/a"; 

drop tmp; 
run; 

/*Re-sort to the proper order*/ 
proc sort data=want; 
by user quarter; 
run; 
0

Sie können eine zusätzliche SET-Anweisung mit FIRSTOBS=2 verwenden, um nach vorne zu schauen. Stellen Sie sicher, dass Sie BY-Gruppen berücksichtigen.

data want ; 
    set have end=eof ; 
    by user; 
    if not eof then set have(keep=Quarter rename=(Quarter=Next_Quarter) firstobs=2) ; 
    if last.user then call missing(Next_Quarter); 
run; 

Wenn Sie mit Gruppen haben nicht dann die letzten

if eof then call missing(Next_Quarter); 
+0

wirklich gut das funktioniert IF ändern! Vielen Dank! – whyq