Was ist der Unterschied zwischen IF
und IF-THEN
IF-THEN IF vs in SAS
Zum Beispiel die folgende Anweisung
if type='H' then output;
vs
if type='H';
output;
Was ist der Unterschied zwischen IF
und IF-THEN
IF-THEN IF vs in SAS
Zum Beispiel die folgende Anweisung
if type='H' then output;
vs
if type='H';
output;
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.
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
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.
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