Guten Abend!
Folgende Beispieldaten habe ich:
data start;
input runde location;
datalines;
1 101
1 203
1 303
1 401
1 502
2 106
2 201
2 300
2 409
2 505
3 1
3 17
3 32
3 45
;
run;
Jeder Beobachtung soll
differenz = location(n+1) - location(n)
angehängt werden. Allerdings soll bei last.runde dann ein missing stehen.
Wie kann ich das elegant erreichen?
Mit retain habe ich mich noch nicht so angefreundet 😞
Vielen Dank.
Frank
Hallo, Frank,
das lässt sich ganz ohne RETAIN mit einem "Look-ahead-Merge" erreichen:
data ziel;
merge start
start(firstobs=2 rename=(runde=nextrunde location=nextlocation));
if runde=nextrunde then differenz=nextlocation-location;
drop next:;
run;
Falls die SAS-Systemoption MERGENOBY auf WARN gesetzt ist, würde ich sie für diesen Step vorübergehend auf NOWARN umsetzen, damit keine unnötige Warning im Log erscheint:
options mergenoby=nowarn;
Beste Grüße
Reinhard
Das hatte ich mir auch schon angesehen .... aber nicht recht verstanden 😞
Funktioniert super - vielen Dank!
Ich werde es morgen auf die "heissen" Daten loslassen - mal sehen was passiert 😉
Danke und Grüße
Frank
Der Trick besteht darin, dass durch das firstobs=2 die Sätze der zweiten Kopie von start um einen nach oben versetzt neben die Sätze der ersten Kopie gestellt werden. Dadurch hat man eine Kopie des zweiten Satzes neben dem ersten, eine Kopie des dritten neben dem zweiten usw. ("look ahead"). Dank der RENAME=-Option lassen sich die Variablen der beiden Kopien des Datasets unterscheiden und wie verschiedene Variablen verwenden. Die IF-Bedingung verhindert, dass die Differenzen über Gruppengrenzen hinweg gebildet werden.
Vielen Dank - funktioniert.
So elegant .... ich sollte eher mal nachfragen 😉
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!