2014-05-18 16 views
5

Was ist der Unterschied zwischen IF und IF-THENIF-THEN IF vs in SAS

Zum Beispiel die folgende Anweisung

if type='H' then output; 

vs 

if type='H'; 
output; 
+0

Der Abschnitt Comparisons der SAS-Dokumentation zu [Subsetting IF Statement] (http://support.sas.com/documentation/cdl/en/lestmtsref/67175/HTML/default/viewer.htm#p1cxl8ifdt8u0gn12wqbji8o5fq1.htm) gibt Details darüber, wie die Untergruppe "IF" mit den Anweisungen "IF-THEN" und "WHERE" verglichen wird. – Amir

Antwort

7

Eine Wenn-Dann-Anweisung führt bedingt Code aus. Wenn die Bedingung für eine gegebene Beobachtung erfüllt ist, wird was auch immer dem "Dann" vor dem ; ausgeführt, andernfalls ist es nicht. Da in Ihrem Beispiel output folgt, werden nur Beobachtungen mit dem Typ 'H' an die Datei (en) ausgegeben, die vom Datenschritt erstellt werden. Sie können auch eine if-then-do-Anweisung, wie im folgenden Code haben:

if type = 'H' then do; 
i=1; 
output; 
end; 

If-then-do-Anweisungen bedingt Code zwischen den do; und den end; auszuführen. Daher führt der obige Code i=1; und output; nur aus, wenn der Typ gleich 'H' ist.

Ein if ohne then ist ein "subsetting if". Nach SAS documentation:

A subsetting IF-Anweisung die Bedingung prüft nach einer Beobachtung in die Programmdaten Vector (PDV) lesen ist. Wenn die Bedingung wahr ist, verarbeitet SAS die aktuelle Beobachtung weiter. Andernfalls wird die Beobachtung verworfen und die Verarbeitung wird mit der nächsten Beobachtung fortgesetzt.

Somit, wenn die Bedingung eines subsetting if (ex. type='H') nicht erfüllt ist, die Beobachtung nicht ausgegeben, auf den Datensatz wird durch den Daten Schritt angelegt wird. In Ihrem Beispiel werden nur Beobachtungen mit dem Typ 'H' ausgegeben.

In der Zusammenfassung, produzieren beide Ihre Beispielcodes das gleiche Ergebnis, aber auf andere Weise. if type='H' then output; gibt nur Beobachtungen aus, bei denen der Typ 'H' ist, während if type='H'; output; Beobachtungen ignoriert, bei denen der Typ nicht 'H' ist.Beachten Sie, dass Sie in diesem Fall die output; nicht benötigen, da im SAS-Datenschritt eine implizite Ausgabe erfolgt, die nur überschrieben wird, wenn ein expliziter Befehl output; vorliegt.

+5

Das ist meistens richtig. Die Subset-Option "if" verhindert jedoch technisch nicht die Produktion; und es tut mehr als nur die Ausgabe in den meisten Situationen zu verhindern. Insbesondere beendet die Untergruppe "if" die aktuelle Iteration der Datenschrittschleife und kehrt zum Anfang des Datenschritts zurück; ähnlich wie "wenn (...) dann zurück". Dies ist wichtig, da alles, was nach der Teilmenge "if" ist, die fehlgeschlagen ist, nicht in dieser Zeile ausgeführt wird. Subsetting 'if' verhindert die automatische Ausgabe (da dies die nicht automatische' Ausgabe verhindern würde; 'oben), hat jedoch keinen Einfluss auf frühere' output'-Anweisungen. – Joe

3

Sie sind ähnlich, aber nicht identisch. In einem Datenschritt ist if eine Teilmengenanweisung und alle Datensätze, die die Bedingung nicht erfüllen, werden gelöscht. Aus der Dokumentation:

"verarbeitet nur die Beobachtungen weiter, die die Bedingung des angegebenen Ausdrucks erfüllen."

if then funktioniert mehr wie die if Anweisung in anderen Sprachen, es führt die Anweisung nach der then Klausel bedingt. Ein etwas konstruiertes Beispiel:

data baz; 
set foo; 
if type = 'H'; 
x = x + 1; 
run; 

data baz: 
set foo; 
if type='H' then x = x + 1; 
run; 

In beiden Beispielen x wird um 1, wenn type = 'H', aber in dem ersten Daten Schritt inkrementiert baz enthält keine Beobachtungen mit Typ nicht gleich 'H'.

Heutzutage scheint es, als ob die meisten Dinge, die von if durchgeführt wurden, mit where erledigt werden.