Expertentipp:
Wussten Sie schon, was der Unterschied zwischen IF und WHERE im SAS Data Step ist?
Und so geht’s:
Im Data Step haben die WHERE-Anweisung und die IF-Anweisung (Subsetting IF) eine ähnliche Funktion. Sie liefern ein vergleichbares Ergebnis. Aber was ist der Unterschied? Oder ist es egal, was man wo verwendet?
Unterschied zwischen WHERE- und IF-Anweisung im DATA Step
Bei WHERE werden die einzulesenden Datenzeilen geprüft und nur diejenigen, die die WHERE-Bedingung erfüllen, werden eingelesen und in den Program Data Vector (PDV) geschrieben. Das ist sehr effizient, denn man erspart sich überflüssige Lesevorgänge. Aber man kann die Bedingung nur mit Variablen formulieren, die in der einzulesenden Datei enthalten sind. Und, falls man in diesem Data Step mehrere Dateien einliest, müssen die Variablen, die in der Bedingung verwendet werden, in allen Dateien enthalten sein. Das sind nicht unerhebliche Einschränkungen in der Einsetzbarkeit.
Fazit: Eingeschränkte Einsetzbarkeit, aber wenn es geht, dann ist es sehr effizient.
Beim Subssetting IF hingegen, werden alle Sätze zuerst einmal eingelesen und erst bei der Verarbeitung des Satzes wird dann geprüft, ob die Bedingung erfüllt ist. Wenn ja, wird mit der Zeile weitergearbeitet und sie wird in die Ergebnisdatei geschrieben. Das ist nicht so effizient wie die Verarbeitung beim WHERE, aber man kann hier die Bedingungen auch mit Variablen formulieren, die man zuerst berechnen muss oder die aus einer Rohdatendatei eingelesen werden. Und beim MERGE funktioniert es auch problemlos, wenn die Variablen, die in der Bedingung verwendet werden, nicht in allen Dateien enthalten sind.
Fazit: Universell und immer im Data Step einsetzbar, aber nicht so effizient.
Beispiel:
Folgende beiden Data Steps erstellen eine identische Ergebnisdatei mit 10 Zeilen. Aber das erste Programm liest nur die gewünschten 10 Zeilen ein, wohingegen das zweite alle 19 Zeilen einliest und erst später entscheidet, welche Zeilen in die Ergebnisdatei geschrieben werden.
data results1;
set sashelp.class;
/* WHERE applied at compile time */
/* Processes ONLY matching obs */
where sex='M';
run;
data results2;
set sashelp.class;
/* IF evaluated at run time */
/* Processes EVERY obs */
if sex='M';
run;
Probieren Sie es aus!
Diese und weitere Tipps zum Thema erhalten Sie im Kurs SAS® Programmierung 1: Grundlagen.