Ist es möglich, SAS-Datensätze zu durchlaufen?

8

Ich habe 60 sas Datasets, die Daten über einzelne Merkmale des Verbrauchers wie id, gender, age, amountSpent, .... enthalten. Jeder Datensatz zeigt Daten nur für einen Zeitraum (data1 ist Jan, data2 ist Feb ...). Ich kann sie wegen der Größe und einiger anderer Probleme nicht zusammenführen.

Wie kann ich eine Mehrfachschleife schreiben, um durch jeden der Datensätze zu gehen, einige Manipulationen vorzunehmen und die geschätzten Werte in eine temporäre Datei zu speichern.

SAS hat keine for -Schleife. Wie kann ich do verwenden?

    
Buras 01.08.2013, 02:15
quelle

5 Antworten

7

Aber sas hat eine Makroschleife. Also im Grunde brauchst du 3 Dinge: 1. In gewisser Weise eine Auflistung Ihrer Datensätze. 2. Ein Makro, das diese Auflistung umläuft. 3. Was du machen willst.

Nehmen wir beispielsweise an, Sie hätten eine Datenmenge WORK.DATASET_LIST, die eine Variablenbibliothek (libname) und ein Variablenmitglied (Datensatzname) für jede Datenmenge enthält, die Sie durchschleifen möchten.

Dann könnten Sie tun:

%Vor%

Das ist die Idee. Vielleicht möchten Sie die Liste Ihrer Datensätze auf andere Weise erfassen. z. B. eine Makrovariable, die sie alle enthält. In diesem Fall müssen Sie die% Scan-Funktion in der Schleife verwenden, um ein Dataset auszuwählen. Oder vielleicht gibt es Logik in der Benennung, z. B. dataset1, dataset2, dataset3 ..., in diesem Fall könnten Sie einfach das & amp; iter verwenden. Makrovariable.

    
mvherweg 01.08.2013, 05:05
quelle
7

Eine andere Option besteht darin, eine Ansicht zu erstellen, die alle Datensätze kombiniert. Bei diesem Ansatz werden Sie keine Probleme mit der Datengröße bekommen (obwohl ich nicht weiß, ob die anderen Probleme, auf die Sie sich beziehen, hier ein Problem sind). Sie benötigen eine Liste der relevanten Datensätze, die Sie in PROC SQL von DICTIONARY.TABLES erhalten können.

%Vor%

Dann führen Sie einfach Ihre Zusammenfassung gegen die Ansicht aus, so dass Sie nicht jedes Dataset durchlaufen müssen. Ich nehme an, dass Ihre Datasets eine Datumsvariable haben, ansonsten müssen Sie zusätzliche Funktionalität hinzufügen (dies gilt für jede Lösung). Es wäre interessant zu sehen, wie dies im Vergleich zu den anderen Lösungen hier funktioniert.

    
Longfish 01.08.2013 09:37
quelle
6

So löst ich dieses Problem in meiner täglichen Programmierung, wenn es notwendig ist, ein Makro wiederholt basierend auf Daten aufzurufen. Dieser Ansatz funktioniert genauso gut mit vielen Datensätzen oder vielen Variablen aus einem Datensatz oder mit vielen verschiedenen Makroaufrufen aus einem Datensatz. Erstellen Sie einfach einen Datensatz mit den Informationen, die variieren, und nennen Sie ihn so.

Dieser Ansatz kombiniert Elemente der Shorack-Lösung mit user2337871 und Neil's. Warum anders?

  • Das Makro sollte mit Parametern aufgerufen werden und nicht seine Parameterdefinitionen darin enthalten. Dies macht es flexibler für die zukünftige Verwendung (wo zum Beispiel der Datensatz dataset_list etwas anderes sein könnte).
  • Flexibilität beim Aufruf basierend auf Dataset von Namen, anstatt Makro zum Aufruf von Makro
  • zu benötigen
  • Das Entfernen von Code in ein Makro (anstelle von call execute oder einer anderen Aufrufmethode) erleichtert das Lesen.
  • call execute kann einige Nachteile haben, abhängig von der Manipulation, die Sie gerade machen (in Bezug auf das Timing der Makrovariablen)

Nehmen wir an, Sie machen ein PROC MEANS und hängen das dann an einen Hauptdatensatz an. Während dies eine sehr langsame und nervige Art ist, dies zu tun (im Gegensatz zur Kombination von BY und ODS OUTPUT mit nicht kombinierten Datensätzen), nehmen wir an, dass Ihre eigentliche Aufgabe komplizierter ist.

%Vor%

Sie können der where-Anweisung in der proc sql zusätzliche Kriterien hinzufügen oder mithilfe von CALL EXECUTE oder einer Reihe anderer Optionen aufrufen. Sie können auch ein selbst erstelltes Dataset mit den Dataset-Namen verwenden (und sogar die Variablen als weitere Spalten- und Makroparameter, wenn sich die Variablen von Interesse nach Dataset unterscheiden).

    
Joe 01.08.2013 13:47
quelle
3

Meine Antwort lautet "Makro".

%Vor%

dann können Sie es aus einer anderen Makroschleife aufrufen ...

%Vor%     
Neil Neyman 01.08.2013 05:05
quelle
3

Da keine Makros benötigt werden, verarbeitet CALL EXECUTE jede Datenmenge in einem libname oder mehreren libnames, indem einfach eine Abfrage auf der SASHELP.VTABLE erstellt und dann für jede Instanz ein Datenschritt ausgeführt wird. Normalerweise entkleide oder komprimiere ich die Dataset-Namen, um sicherzustellen, dass Leerzeichen keine Probleme verursachen, aber Sie können diese selbst hinzufügen. Sie können auch die relevanten Änderungen an der Teilmenge vornehmen und die Ergebnisse an ein einzelnes temporäres Dataset anfügen.

%Vor%     
user2337871 01.08.2013 08:31
quelle

Tags und Links