Community deutschsprachiger SAS-Anwender und -Programmierer

Antworten
Dies ist eine offene Gruppe. Melden Sie sich an und klicken Sie auf die Schaltfläche „Gruppe beitreten“, um Mitglied zu werden und damit zu beginnen, Beiträge in dieser Gruppe zu veröffentlichen.
Highlighted
Contributor
Beiträge: 30
Differenzbildung mit vorhergehender Beobachtung

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 

Trusted Advisor
Beiträge: 1.114
Re: Differenzbildung mit vorhergehender Beobachtung

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

Contributor
Beiträge: 30
Re: Differenzbildung mit vorhergehender Beobachtung

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

 

Trusted Advisor
Beiträge: 1.114
Re: Differenzbildung mit vorhergehender Beobachtung

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.

Contributor
Beiträge: 30
Re: Differenzbildung mit vorhergehender Beobachtung

Vielen Dank - funktioniert.

So elegant .... ich sollte eher mal nachfragen ;-)