2010-04-19 9 views
8

In SAS 9 kann ich in einem einfachen Datenschritt die Reihenfolge des Feldes neu anordnen.SAS: Umordnung der Feldreihenfolge im Datenschritt

Data set2; 
    /*Something probably goes here*/ 
    set set1; 
run; 

Also, wenn set1 die folgenden Felder hat:

Name Title Salary 
A  Chief 40000 
B  Chief 45000 

Dann kann ich die Feldreihenfolge von set2 ändern:

Title Salary Name 
Chief 40000 A 
Chief 45000 B 

Danke,

Dan

+1

Könnten Sie ein wenig hinzufügen mehr Informationen darüber, warum Sie das tun wollen? Wenn es zum Formatieren/Drucken ich denke, Sie können das mit proc print behandeln ... – mcpeterson

Antwort

5

Wenn Sie eine sehr große Anzahl von Variablen in der Datenmenge haben manchmal ist es einfacher, eine SQL-Anweisung anstelle eines datastep zu verwenden. Auf diese Weise können Sie nur die Variablen auflisten, deren Reihenfolge Sie interessieren, und einen Platzhalter verwenden, um alles andere beizubehalten.

proc sql noprint; 
    create table set2 as 
    select title, salary, * 
    from set1; 
quit; 

Wenn Sie dies mit einer großen Tabelle tun, können Sie sich den E/A-Overhead sparen, indem Sie stattdessen eine Ansicht erstellen. Dies kann sowohl auf den Datensatzansatz als auch auf den proc sql-Ansatz angewendet werden.

proc sql noprint; 
    create view set2 as 
    select title, * 
    from set1; 
quit; 

** OR; 

data set2/view=set2; 
    retain title salary name; 
    set set1; 
run; 

Prost Rob

+1

Nur um klar zu sein, haben alle Methoden in den Link von @mcpeterson aufgeführten auch das Verhalten, das Sie PROC SQL zuweisen - muss man nicht Geben Sie eine Reihenfolge aller Variablen im Dataset an, nur diejenigen, die von Interesse sind. Der Rest wird noch behalten (sofern nicht anderswo anders angegeben). – user667489

3

Sie können auch eine informat Anweisung, dies zu tun verwenden - es gibt keine Notwendigkeit, alle in Formaten zu spezifizieren. Ich vermute, dass dies etwas effizienter ist als eine äquivalente Retain-Anweisung, da es SAS ermöglicht, Werte auf fehlende Werte zu initialisieren, anstatt sie aus der vorherigen Zeile abzurufen. In der Praxis ist der Unterschied minimal und Sie haben auch die Möglichkeit, eine Ansicht zu verwenden.

data set2; 
    informat title salary name; 
    set set1; 
run; 

Die Variablen in der informat Anweisung angegeben sind links von der Datenmenge und in dieser Reihenfolge bewegt wird, und der Rest gelassen werden, wie sie in dem Eingabedatensatz waren.

+0

SAS funktioniert nicht so, wie Sie es denken, soweit beibehalten oder nicht beibehalten. RETAIN ruft keine Werte aus der vorherigen Zeile ab. Tatsächlich bewirkt SAS, dass eine Variable nicht zwischen Iterationen fehlt. Wenn es also einen Unterschied in der Funktionsweise dieser und der informat-Lösung gäbe, wäre sie schneller und nicht langsamer. Ich vermute, dass es keinen Unterschied zwischen den beiden gibt, da SAS in beiden Fällen genau dasselbe tun würde (definiere die Variable im PDV und stoppe). – Joe

+0

Ja, ich habe dieses Bit falsch verstanden.Ich denke jedoch, dass es immer noch einen Fall für Informat vs. Retain gibt, da ersteres weniger wahrscheinlich unbeabsichtigtes Verhalten verursacht, z. wenn das Quell-Dataset fehlende Werte enthält. – user667489

+0

Ich stimme vorläufig mit Ihnen überein, solange ich mich erinnere, warum es so ist, dass fast niemand "informat" (oder "format") auf diese Weise verwendet und fast jeder "retain" verwendet, trotz der Möglichkeit unbeabsichtigter Konsequenzen ... – Joe

0

persönlich verwende ich die attrib Aussage - wie folgt:

data set2; 
    attrib title salary name label=''; 
    set set1; 
run; 

Ganz wie die informat Ansatz obwohl (eher brauchen ein Etikett als ein informat müssen)

Verwandte Themen