LesezeichenAbonnierenRSS-Feed abonnieren
sauer
Obsidian | Level 7

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 

4 ANTWORTEN 4
FreelanceReinh
Jade | Level 19

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

sauer
Obsidian | Level 7

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

 

FreelanceReinh
Jade | Level 19

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.

sauer
Obsidian | Level 7

Vielen Dank - funktioniert.

So elegant .... ich sollte eher mal nachfragen 😉

 

SAS Innovate 2025: Call for Content

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!

Submit your idea!

Diskussionsstatistiken
  • 4 Antworten
  • 1218 Aufrufe
  • 0 Kudos
  • 2 in Unterhaltung