Techniquement, la macro %CORDER illustre une technique SAS robuste : l'utilisation du RETAIN couplé à une liste de variables générée dynamiquement par CALL SYMPUT.
En réorganisant le vecteur de colonnes (PDV - Program Data Vector) avant l'instruction SET, elle modifie l'ordre physique des variables dans la table de sortie sans altérer les données elles-mêmes. Le nettoyage des tables temporaires comme _comp_ et la conservation des variables via le paramètre COPY en font un outil 'prêt à l'emploi' pour industrialiser le nettoyage de tables larges avant leur livraison à des data scientists
Type : SASHELP | EXTERNE
Le script prend un jeu de données d'entrée via le paramètre DATA. Ce jeu de données peut provenir de SASHELP ou être un jeu de données externe géré par l'utilisateur. Les variables à analyser sont spécifiées par le paramètre VAR, et d'autres variables à conserver sont spécifiées par COPY.
| 1 | /*--------------------------------------------------------------* |
| 2 | * Name: corder.sas * |
| 3 | * Title: Reorder variables in a data set by correlations * |
| 4 | * Doc: http://www.math.yorku.ca/SCS/sasmac/nodoc.html * |
| 5 | *--------------------------------------------------------------* |
| 6 | * Author: Michael Friendly <friendly @yorku.ca> * |
| 7 | * Created: 15 Dec 1999 15:33:48 * |
| 8 | * Revised: 15 Dec 1999 15:33:48 * |
| 9 | * Version: 1.0 * |
| 10 | * * |
| 11 | *--------------------------------------------------------------*/ |
| 12 | /*= |
| 13 | =Description: |
| 14 | |
| 15 | The CORDER macro |
| 16 | |
| 17 | =Usage: |
| 18 | |
| 19 | The CORDER macro is defined with keyword parameters. |
| 20 | The arguments may be listed within parentheses in any order, separated |
| 21 | by commas. For example: |
| 22 | |
| 23 | %corder(); |
| 24 | |
| 25 | ==Parameters: |
| 26 | |
| 27 | * DATA= The name of the input data set [Default: DATA=_LAST_] |
| 28 | |
| 29 | * VAR= List of variables to be reordered |
| 30 | |
| 31 | * COPY= Other variables to be copied |
| 32 | |
| 33 | * ORDERBY= Order by PRINn or ANGLE [Default: ORDERBY=PRIN1] |
| 34 | |
| 35 | * COV= What to analyze? |
| 36 | |
| 37 | * OUT= Name of output data set [Default: OUT=CORDER] |
| 38 | |
| 39 | =*/ |
| 40 | %macro corder( |
| 41 | DATA=_last_, |
| 42 | var=, /* list of variables to be reordered */ |
| 43 | copy=, /* other variables to be copied */ |
| 44 | orderby=PRIN1, /* order by PRINn or ANGLE */ |
| 45 | cov=COV, /* reset to null to analyze correlations */ |
| 46 | out=corder, /* name of output data set */ |
| 47 | ); |
| 48 | |
| 49 |
| 1 | /*---------------------------------------* |
| 2 | | Re-order vars by PRIN | |
| 3 | *---------------------------------------*/ |
| 4 | %let orderby=%upcase(&orderby); |
| 5 | PROC PRINCOMP DATA=&DATA &cov outstat=_comp_ noprint; |
| 6 | var &var; |
| 7 |
| 1 | |
| 2 | DATA _comp_; |
| 3 | SET _comp_; |
| 4 | where _type_='SCORE'; |
| 5 | drop _name_ _type_; |
| 6 |
| 1 | |
| 2 | PROC TRANSPOSE |
| 3 | DATA=_comp_ out=_comp_ prefix=prin; |
| 4 |
| 1 | |
| 2 | %IF &orderby=ANGLE %THEN %DO; |
| 3 | DATA _comp_; |
| 4 | SET _comp_; |
| 5 | angle = atan(prin2/prin1); |
| 6 | %END; |
| 7 |
| 1 | |
| 2 | PROC SORT; |
| 3 | BY &orderby; |
| 4 |
| 1 | |
| 2 | DATA _null_; |
| 3 | SET _comp_ END=eof; |
| 4 | LENGTH vars $200; |
| 5 | retain vars; |
| 6 | IF _n_=1 |
| 7 | THEN vars = _name_; |
| 8 | ELSE vars = trim(vars) || ' ' || _name_; |
| 9 | IF eof THEN call symput('var', trim(vars)); |
| 10 | RUN; |
| 11 |
| 1 | |
| 2 | DATA &out; |
| 3 | retain &var © |
| 4 | SET &DATA; |
| 5 | %global vorder; |
| 6 | %let vorder = &var; |
| 7 | %mend; |
| 8 |