Endlich richtig sortieren mit der Option Sortseq der Prozedur SORT

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Carina Ortseifen: Carina Ortseifen, Grischa Pfister, Heribert Ramroth, Marianne Weires: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2009

Das Sortieren von Tabellen sollte eigentlich ein leichtes sein und zu den grundlegenden Tugenden einer analytischen Software gehören. Doch im Zuge einer immer globaler werdenden Welt, in der man nicht nur mit der englischen, sondern auch mit Deutsch, Schwedisch, Japanisch und Chinesisch zu tun hat, um nur ein paar der vorkommenden Sprachen zu nennen, wird schnell klar, dass Sortieren vielleicht doch nicht so einfach ist.

Wir wollen folgende Begriffe alphabetisch sortieren: Esel eins essen dass daß älter USA und übung Übung alt 0123 123 aelt ub Alter

Dazu lesen wir diese in eine SAS-Tabelle szene ein und sortieren nach der Variable stichwort:

Proc Sort Data=szene Out=test;
By Stichwort;
Run;


Und erhalten die folgende Liste:

Obs stichwort
1 0123
2 123
3 Alter
4 Esel
5 USA
6 aelt
7 alt
8 dass
9 daß
10 eins
11 essen
12 ub
13 und
14 Übung
15 älter
16 übung

Nach den Ziffern 0, 1 usw. erscheinen die mit Großbuchstaben beginnenden Worte von A bis U, dann die mit Kleinbuchstaben beginnenden und schließlich die mit einem Umlaut beginnenden Buchstaben. Sehr schön und eindeutig, aber für uns Deutsche eher unbrauchbar.

Mit SAS 9.2 gibt es die neue Option SORTSEQ=LINGUISTIC, welche ein linguistisches Sortieren erlaubt. Und die Suboption COLLATION=PHONEBOOK passt genau auf die Bedürfnisse der Deutschen, die Worte analog zum Telefonbuch zu sortieren. D.h. Klein- und Großbuchstaben-Wörter sind nicht strikt getrennt und ä wird aufgelöst in ae und zwischen ad und af einsortiert.

Das erweiterte Programm hat dann folgende Form:

proc sort data=szene out=test 	 	
     Sortseq=Linguistic(collation=phonebook);;
   by stichwort;
run;

und liefert folgendes Ergebnis:

Obs stichwort
1 0123
2 123
3 aelt
4 älter
5 alt
6 Alter
7 dass
8 daß
9 eins
10 Esel
11 essen
12 ub
13 übung
14 Übung
15 und
16 USA

Eine weitere schöne Suboption ist NUMERIC_COLLATION=ON, womit Hausnummern von Straßennamen und andere Zahlen innerhalb von Textwerten korrekt sortiert werden können:

data liste;
   input name $ 1-20;
   datalines;
X-Weg 2
X-Weg 120
X-Weg 10
;
proc sort data=liste out=test 
      sortseq=linguistic(collation=phonebook
      numeric_collation=on);
   by name;
run;

Mit dem Ergebnis:

obs name
1 X-Weg 2
2 X-Weg 10
3 X-Weg 120

Obs name

Literatur