Data Step

Implizite vs. Explizite Ausgabe verstehen

Simon 8 Aufrufe

Der Unterschied zwischen impliziter und expliziter Ausgabe (OUTPUT) ist oft eine Quelle der Verwirrung für Anfänger, aber genau das macht den Data Step so leistungsfähig.

In Foren taucht oft die Frage auf: "Ich verstehe die Theorie, aber wann soll ich das eine oder das andere verwenden?"

Hier ist eine klare Erklärung, basierend auf Expertenantworten, die zeigt, wie man den Ausgabeprozess in SAS© steuert.

Note :
Das Standardverhalten: Implizite Ausgabe
Um es richtig zu verstehen, muss man sich vorstellen, was SAS© während eines klassischen Data Steps "hinter den Kulissen" macht.

Standardmäßig verfügt jeder Data Step über eine implizite (automatische) Ausgabeanweisung am Ende des Codes, direkt vor dem RUN. Der Ablauf ist wie folgt:

SAS© liest eine Beobachtung.

Es führt Ihre Berechnungen aus.

Es schreibt die Zeile in die Ausgabetabelle (Implizite Ausgabe).

Es leert den PDV (Program Data Vector) und kehrt zum Anfang zurück, um die nächste Beobachtung zu lesen.

Deshalb müssen Sie bei einer einfachen Kopie kein OUTPUT schreiben:
1DATA test;
2 SET SOURCE;
3 /* L'output se fait tout seul ici ! */
4RUN;
Note :
Die Kontrolle übernehmen: Explizite Ausgabe
Sobald Sie das Schlüsselwort OUTPUT (oder OUTPUT tabellenname) irgendwo in Ihrem Data Step schreiben, deaktivieren Sie die automatische implizite Ausgabe.

SAS© geht dann davon aus, dass Sie die Kontrolle übernehmen: Es schreibt eine Zeile nur, wenn und wann Sie es ihm sagen.

Dies eröffnet zwei wichtige Anwendungsfälle, die in der Diskussion erläutert werden:

Fall A: Das Dispatching (Daten verteilen)
Wie Cathy erklärt, ist dies unerlässlich, um eine Tabelle in einem einzigen Durchlauf ("one pass") in mehrere Untertabellen aufzuteilen.

Ohne explizites OUTPUT würde SAS© jede Zeile in alle Tabellen senden. Mit OUTPUT steuern Sie den Fluss:
1DATA hommes femmes;
2 SET demog;
3 IF sexe = 'M' THEN OUTPUT hommes; /* Écrit seulement dans la table HOMMES */
4 ELSE IF sexe = 'F' THEN OUTPUT femmes; /* Écrit seulement dans la table FEMMES */
5RUN;
Note :
Fall B: Aggregation und Filterung (Kontrolle der Schreibhäufigkeit)
Der zweite Experte zeigt, wie man die Anzahl der Zeilen (Aggregation) reduzieren kann, ohne ein statistisches Verfahren (PROC MEANS) zu verwenden.

Die Idee ist, Zeile für Zeile Berechnungen (Summen, Zähler) durchzuführen, das Ergebnis aber erst am Ende einer Gruppe zu schreiben (wenn last.variable wahr ist).
1DATA synthese;
2 SET ventes;
3 BY produit; /* Nécessaire pour utiliser first. et last. */
4
5 /* Accumulation des sommes... */
6 IF first.produit THEN total = 0;
7 total + montant;
8 
9 /* On écrit SEULEMENT quand le groupe est fini */
10 IF last.produit THEN OUTPUT;
11RUN;
In diesem Beispiel:

Wenn Sie die implizite Ausgabe beibehalten hätten, hätten Sie für jede Eingabezeile eine Ausgabezeile (mit Teilergebnissen) erhalten.

Mit der expliziten bedingten Ausgabe (if ... then output) erhalten Sie nur eine Zeile pro Produkt.

Zusammenfassung: Die goldene Regel

TypBeschreibungWann verwenden?
ImplizitAutomatisch am Ende des Schritts.Für einfache Transformationen (1 Eingabezeile = 1 Ausgabezeile).
ExplizitManuell über die OUTPUT-Anweisung. Deaktiviert die Automatik.Zum Aufteilen von Daten (1 in N Tabellen), Multiplizieren von Zeilen (1 in N Zeilen) oder Aggregieren (N in 1 Zeile).

Technische Anmerkung: Eine weitere häufig erwähnte Anwendung ist das "Parsen" komplexer Dateien. Wenn eine Textdatei gemischte Header, Details und Fußzeilen enthält, ermöglicht die explizite Ausgabe, die Header in Tabelle A und die Details in Tabelle B zu senden, alles in einem einzigen Durchgang.