2010-04-19 6 views
8

Dans SAS 9, comment pouvez-vous, dans une étape de données simple, réorganiser l'ordre du champ.SAS: réorganisation de l'ordre des champs dans l'étape de données

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

Donc, si set1 a les champs suivants:

Name Title Salary 
A  Chief 40000 
B  Chief 45000 

Ensuite, je peux changer l'ordre sur le terrain de set2 à:

Title Salary Name 
Chief 40000 A 
Chief 45000 B 

Merci,

Dan

+1

Pourriez-vous ajouter un peu plus des informations sur la raison pour laquelle vous voulez faire cela? Si c'est pour le formatage/impression je pense que vous pouvez gérer cela avec proc print ... – mcpeterson

Répondre

5

Si vous avez un très grand nombre de variables dans votre ensemble de données parfois, il est plus facile d'utiliser une instruction SQL au lieu d'un datastep. Cela vous permet d'afficher uniquement les variables dont vous vous souciez de l'ordre et d'utiliser un caractère générique pour conserver tout le reste.

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

Si vous faites cela avec une grande table que vous pouvez vous épargner les frais généraux IO en créant une vue au lieu. Cela peut être appliqué à la fois à l'approche de l'ensemble de données ou à l'approche proc sql.

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

** OR; 

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

Vive Rob

+1

Pour être clair, toutes les méthodes listées dans le lien fourni par @mcpeterson ont aussi le comportement que vous attribuez à PROC SQL - on n'a pas besoin de spécifier un ordre de toutes les variables dans l'ensemble de données, seulement celles d'intérêt. Le reste est toujours conservé (sauf indication contraire ailleurs). – user667489

3

Vous pouvez également utiliser une déclaration informat pour le faire - il n'y a pas besoin de préciser les informats. Je suppose que c'est un peu plus efficace qu'une instruction de conservation équivalente, car cela permet à SAS d'initialiser les valeurs manquantes plutôt que de les récupérer de la ligne précédente. En pratique, la différence est minime et vous avez également la possibilité d'utiliser une vue.

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

Les variables spécifiées dans l'instruction informat sont déplacés vers la gauche de l'ensemble de données et dans cet ordre, et le reste sont laissés comme ils étaient dans l'ensemble de données d'entrée.

+0

SAS ne fonctionne pas comme vous le pensez, dans la mesure où conserver ou ne pas conserver. RETAIN ne récupère pas les valeurs de la ligne précédente; En fait, SAS ne définit pas de variable manquante entre les itérations, donc s'il y avait une différence dans la façon dont cela fonctionnait et avec la solution informat, ce serait plus rapide, et non plus lent. Je soupçonne qu'il n'y a aucune différence entre les deux, car SAS ferait exactement la même chose dans les deux cas (définissez la variable dans le PDV et arrêtez.) – Joe

+0

Oui, j'ai mal compris.Cependant, je pense qu'il y a toujours un cas pour l'informat contre retenir, comme le premier est moins susceptible de causer un comportement inattendu, par exemple. si l'ensemble de données source contient des valeurs manquantes. – user667489

+0

Je serai d'accord avec vous, en attendant de me souvenir pourquoi il est que presque personne n'utilise 'informat' (ou' format') de cette façon, et presque tout le monde utilise 'retain', malgré le potentiel de conséquences imprévues ... – Joe

0

personnellement, j'utiliser la déclaration attrib - comme suit:

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

Tout comme l'approche informat bien (plus susceptibles d'avoir besoin d'avoir besoin d'une étiquette d'une informat)