Grundlagen der SAS Base-Programmierung. Lektion 4. Erstellen von SAS-Datensätzen

In einem früheren Artikel haben wir gelernt, wie man externe Rohdaten liest. Heute lernen wir den SET-Operator kennen, der Standard-SAS-Datensätze (SAS-Datensatz) liest, das Erstellen von Datenschnitten, das Konfigurieren persistenter Attribute und einige nützliche SAS-Funktionen lernt. Ich werde noch einmal versuchen, das Material in der einfachsten Sprache zu präsentieren und dabei so viele Beispiele wie möglich zu verwenden.



Angenommen , die Daten werden im EXCEL-Format im Verzeichnis C: \ Werkstatt \ Habrahabr gespeichert . Wir importieren die Tabelle, erstellen daraus ein Slice, erstellen mithilfe der SAS-Funktionen neue berechnete Spalten und teilen diesen Datensatz dann in zwei Teile.

Importieren Sie eine Tabelle und legen Sie einen Filter fest



Die Excel-Datei wird im obigen Verzeichnis gespeichert und sieht folgendermaßen aus:

Datei-Snippet:


Wir wenden das PROC IMPORT- Verfahren an, um eine Tabelle in ein SAS-Dataset zu konvertieren:

options validvarname=v7; proc import datafile="C:\workshop\habrahabr\company.xlsx" dbms=xlsx out=company replace; getnames=yes; run; 

Die Option validvarname = V7 legt die korrekten Feldnamen aus SAS-Sicht fest: Ersetzt alle ungültigen Zeichen durch Unterstriche. Die Regeln zum Benennen von Variablen finden Sie in Lektion 1.

Wir setzen den Filter sofort beim Lesen einer externen Datei, z. B. wählen wir nur die Beobachtungen aus, bei denen das Enddatum nicht fehlt. Beachten Sie die Syntax des where-Parameters.

 options validvarname=v7; proc import datafile="C:\workshop\habrahabr\company.xlsx" dbms=xlsx out=company (where=(End_Date not is missing)) replace; getnames=yes; run; 

Lassen Sie uns die PROC IMPORT-Schrittoperatoren im Detail betrachten:

Datendatei - Definiert den vollständigen Pfad und Namen der externen Datei
Dbms - Definiert den zu importierenden Datentyp.
Out - Identifiziert das SAS-Ausgabedatensatz mit einem ein- oder zweistufigen SAS-Namen (Bibliotheksname und Datasetname).
Ersetzen - Überschreibt ein vorhandenes SAS-Dataset.
Getnames - Gibt an, ob PROC IMPORT aus den Datenwerten in der ersten Zeile der externen Eingabedatei SAS-Variablennamen generiert.

Führen Sie den Schritt PROC IMPORT aus und überprüfen Sie das LOG:


Drucken Sie den resultierenden SAS-Datensatz:

 proc print data=work.company noobs; run; 

Die Ausgabe der PROC PRINT-Prozedur ist unten dargestellt:

Fragment:


Auch in SAS UE können Sie auf der Registerkarte Ergebnisse das importierte SAS-Dataset anzeigen.


SAS-Datensätze lesen



Das Lesen des SAS-Datasets wird im Schritt DATA mithilfe der SET- Anweisung implementiert:

Beachten Sie die allgemeine Syntax für die SET-Anweisung:

 SET<SAS-data-set(s) <(data-set-options(s) )> > <options>; 

Wenn Sie in der SET-Anweisung kein Dataset angeben, werden die Beobachtungen aus dem zuletzt erstellten SAS-Dataset gelesen.

In der SET-Anweisung können Sie mehrere Datensätze angeben. In diesem Fall werden SAS-Datensätze untereinander hinzugefügt (ähnlich wie bei UNION in SQL).

Im Schritt DATA können auch zwei SET-Anweisungen vorhanden sein. In diesem Fall werden die Tabellen durch eine gemeinsame Spalte verbunden. Weitere Informationen zu den beiden SET-Anweisungen finden Sie beispielsweise in diesem Artikel .

Der einfachste Code zum Erstellen einer Kopie des SAS-Datasets lautet wie folgt:

 data company1; set company; run; 

Konfigurieren eines SAS-Dataset-Deskriptors


Sie können den SAS-Dataset-Deskriptor mithilfe der Prozedur PROC CONTENTS untersuchen ( siehe Lektion 2 ). In diesem Tutorial drucken wir die Deskriptorkomponente mit der Prozedur PROC DATASETS :

 proc datasets library=work nolist; contents data=company order=varnum; quit; 

Ein Fragment der Ergebnisse:


Legen Sie ein konstantes Format für die Variablen Travel_Expenses und Budget fest:

 data company; set company; format Travel_Expenses Budget dollar10.2; run; 

Überprüfen Sie die Attribute der SAS-Datasets:

 proc datasets library=work nolist; contents data=company order=varnum; quit; 


Berechnete Spalten erstellen


Alle SAS-Funktionen können in den SAS 9.4-Funktionen und CALL-Routinen untersucht werden: Referenz, 5. Ausgabe .

Wenn es keine geeignete Funktion zum Ausführen einer bestimmten Aufgabe gibt, können Sie außerdem die PROC FCMP- Prozedur verwenden und Ihre eigene Funktion erstellen.

In dieser Lektion werden die drei Funktionen YRDIF, SUM und CATS untersucht.

Um die Differenz der Daten in Jahren zu berechnen, verwenden wir die YRDIF-Funktion .

Ich möchte Sie daran erinnern, dass ein Datum im SAS-Format die Anzahl der Tage ab dem 1. Januar 1960 ist ( siehe Lektion 1 ). Anhand der präsentierten Daten müssen wir die Ausführungszeit berechnen:

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); format Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Bitte beachten Sie, dass wir unter Verwendung des 3.1-Formats für die Variable Lead_Time die berechneten Werte im Bericht (!) Auf 1 Dezimalstelle gerundet haben. Der Formatoperator ändert den Wert im SAS-Dataset nicht!

Ein Fragment der Ergebnisse:


Als nächstes berechnen wir die Arbeitskosten ohne Reisekosten:

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Ein Fragment der Ergebnisse:


Im Rahmen unserer Aufgabe haben wir die Arbeitskosten ohne Berücksichtigung der Reisekosten ohne Verwendung der Funktion berechnet. In unserer Tabelle fehlen keine Werte. Wenn eine der Variablen (Budget oder Travel_Expenses) einen fehlenden Wert hatte, war das Ergebnis "Mission".

Zum Beispiel:

Erstellen Sie einen Testdatensatz:

 data test; input Budget Travel_Expenses; datalines; 12345 233 . 345 12543 . ; 

Berechnen Sie die Differenz der Variablen Budget Travel_Expenses

 data test; set test; value=Budget-Travel_Expenses; run; 

Das Ergebnis dieses Schritts:


Um das richtige Ergebnis zu erhalten, können Sie die SUMME- Funktion verwenden.

Diese Funktion gehört zur Kategorie der beschreibenden Statistikfunktionen . Beschreibende Statistikfunktionen ignorieren fehlende Werte.

Code über SUM schreiben:

 data test; set test; value=sum(Budget,-Travel_Expenses); run; 

In diesem Fall ist das Ergebnis des Schritts wie folgt:


Die dritte berechnete Spalte ist die E-Mail-Adresse des Managers. Es kann aus den Spalten Manager_FirstName, Manager_LastName und den Werten habr .com "zusammengestellt" werden

Mit der CATS-Funktion können Sie Textwerte in einer Zeile kombinieren.

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Ein Fragment der Ergebnisse:


Lassen Sie uns den Deskriptor des erstellten Datensatzes untersuchen:

 proc contents data=work.company1 varnum; run; 

Grifffragment:


Achten Sie auf die Länge der E-Mail-Variablen. Sie beträgt 200 Byte. Dies ist die Standardlänge, die von der CATS-Funktion zurückgegeben wird. Wenn wir die Attribute der Variablen Manager_FirstName und Manager_LastName untersuchen, können wir sicherstellen, dass 8 + 6 + die Zeichenfolgenlänge '@ habr.com' für die E-Mail-Variable ausreicht, dh weitere 9 Bytes, insgesamt 23. Warum sollte ich darauf achten? Alle fehlenden Zeichen erreichen Leerzeichen, was sich auf die Größe des Datensatzes und die Leistung bei großen Datenmengen auswirkt.

Um die Länge der E-Mail-Variablen explizit festzulegen, müssen Sie den Operator LENGTH verwenden:

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Fragment behandeln


Erstellen Sie eine detaillierte Spalte basierend auf der Lead_Time-Variablen unter Berücksichtigung der folgenden Bedingungen:

  1. Wenn der Wert der Variablen Lead_Time kleiner als 1 ist, hat die Spalte Detail einen Wert von weniger als 1 Jahr.
  2. Wenn der Wert der Lead_Time-Variablen einschließlich der Ränder im Bereich von 1 bis 2 liegt, hat die Spalte Detail einen Wert von 1-2 Jahren.
  3. Wenn der Wert der Lead_Time-Variablen im Bereich von 2 bis 3 liegt, ausgenommen 2, hat die Spalte Detail einen Wert von 2-3 Jahren.
  4. Wenn der Wert der Lead_Time-Variablen im Bereich von 3 bis 4 liegt, ausgenommen 3, hat die Spalte Detail einen Wert von 3-4 Jahren.
  5. Wenn der Wert der Lead_Time-Variablen im Bereich von 4 bis 5 liegt, ausgenommen 4, hat die Spalte Detail einen Wert von 4 bis 5 Jahren.
  6. In allen anderen Fällen hat die Spalte Detail einen Wert über 5 Jahren.

Sie können eine detaillierte Spalte auf verschiedene Arten erstellen. Die einfachste und naheliegendste Option ist beispielsweise die Verwendung der bedingten Verarbeitung. Es kann mit den folgenden Operatoren implementiert werden:

  1. WENN-DANN-SONST
  2. SONST WENN
  3. WÄHLEN SIE WANN

Für große Datenmengen ist es effizienter, die letzten beiden Optionen zu verwenden.

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='4-5 years'; else detail='above 5 years'; run; 

Fügen Sie eine Bedingung hinzu, die nur die Beobachtungen auswählt, bei denen der Wert der Detailvariablen nicht gleich "über 5 Jahre" ist. Bei Verwendung von where als Filter tritt ein Syntaxfehler auf:


Die where-Klausel wird nicht für berechnete Spalten verwendet. Um die benötigten Variablen auszuwählen, benötigen wir eine selektive IF-Anweisung. Die Ausgabe der Beobachtung in den erstellten Datensatz wird abgebrochen:

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='2-3 years'; else detail='above 5 years'; if detail ne 'above 5 years'; run; 

Beachten Sie auch, dass die selektive IF-Anweisung einen arithmetischen Operator erfordert. Wir können zum Beispiel nicht so schreiben:

 if detail contains 'above 5 years'; 

Ein Fehler wird im Protokoll angezeigt:


Konfigurieren Sie das SAS-Dataset.


Die Variablen Manager_FirstName und Manager_LastName dürfen im neuen SAS-Dataset nicht vorhanden sein. Diese Anforderung wird mithilfe des DROP-Parameters implementiert, und der DROP-Operator kann ebenfalls verwendet werden.

 data company1 (drop=Manager_FirstName Manager_LastName); set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='2-3 years'; else detail='above 5 years'; if detail ne 'above 5 years'; run; 

Wir teilen den erstellten SAS-Datensatz gemäß der gegebenen Bedingung in zwei Teile


In einem DATA-Schritt können Sie mehrere SAS-Datasets erstellen. Erstellen Sie für jedes Land einen eigenen Datensatz.

Um beispielsweise zu überprüfen, welche Werte in der Spalte Land enthalten sind, können Sie die Prozedur PROC FREQ verwenden.

 proc freq data=company1; table Country /nocum nopercent; run; 

In diesem Schritt wird berücksichtigt, wie oft ein bestimmter Wert aus der Ländervariablen in dem im Parameter data = angegebenen SAS-Dataset vorkommt.

Das Ergebnis dieses Schritts ist wie folgt:


Wir werden also zwei Datensätze in einem DATA-Schritt mit dem OUTPUT-Operator und der bedingten Verarbeitung erstellen:

 data US AU; set work.company1; if Country='AU' then output AU; if Country='US' then output US; run; 

Führen Sie den Code aus und sehen Sie sich LOG an:


Hier geht es kurz um das Lesen und Konfigurieren von SAS-Datasets. Im nächsten Artikel werden wir Ihnen das Kombinieren von Datensätzen mit den Anweisungen MERGE und SET vorstellen.

Und als PS möchte ich Sie an die Struktur unserer SAS BASE-Lektionen erinnern:

Bereits veröffentlichte Artikel:

  1. Grundlagen der Programmierung auf SAS BASE. Lektion 1.
  2. Grundlagen der Programmierung auf SAS BASE. Lektion 2. Datenzugriff
  3. Grundlagen der Programmierung auf SAS BASE. Lektion 3. Textdateien lesen.
  4. Sie haben gerade die vierte Lektion gelernt.

In den folgenden Artikeln möchte ich Probleme wie das Verbinden von Tabellen in SAS Base (Zusammenführen, Festlegen), bedingte Verarbeitung, Schleifen, SAS-Funktionen, Erstellen benutzerdefinierter Formate, SAS-Makro und PROC SQL hervorheben.

Ich freue mich über Feedback in den Kommentaren! Welche anderen Themen möchten Sie in den Artikeln sehen?

Source: https://habr.com/ru/post/de426765/


All Articles