%macro ranka(norme,data,var,arr,ngr,noprint=NO); /* Macro écrite par Patrick Brossier (GIP RECLUS) norme nom du format sans le point data tableau des données à discrétiser var nom de la variable à discrétiser arr arrondi (noté 1 pour aucun chiffre après la virgule .1 pour un chiffre après la virgule .01 pour 2 chiffres après la virgule) ngr nombre de classes noprint yes pour supprimer les impressions Cette macro permet de faire une discrétisation selon la méthode des quantiles et de générer le format associé. Macros utilisées: %forme %temp Macros variables disponibles: _form -> nom du format _idec -> nombre de chiffres demandés après la virgule Version du 08/07/99 */ %forme; %local dec; %let dec=%index(&arr,.); %if &dec^=0 %then %let dec=%length(%substr(&arr,%eval(&dec+1))); %let norme=%upcase(&norme); %let noprint=%upcase(&noprint); proc sort data=&data(keep=&var) out=tempo1;by &var; proc rank data=tempo1 out=tempo2 group=&ngr; var &var; ranks _rank; proc sort data=tempo2;by _rank; %if &noprint=YES %then %let imp=noprint; %else %let imp=; data tempo1(keep=dif);set tempo1; dif=&var-lag(&var); if dif=0 then dif=.; proc means data=tempo1 noprint;var dif; output out=tempo1 min=_min; data _null_;set tempo1; g=compress(put(_min/2,best.)); call symput('darr',g); run; proc means data=tempo2 &imp maxdec=&dec; var &var; by _rank; output out=tempo1 min=min max=max; data _null_; file forme; set tempo1; v1=round(min,&arr); v2=round(max,&arr); if _n_=1 then do; put 'macro _formr ' %quote("&norme") '. %'; deca=&dec; put 'macro _idec ''' deca ''' %'; darr=↓ put 'proc format; value ' %quote("&norme") '(fuzz=' darr ')'; end; if min=. & max=. then put '. = ''valeur manquante'''; else if min=max then put min e16. '=''' v1 ''''; else put min e16. '- ' max e16. '=''de ' v1 'à ' v2 ''''; run; %inc forme;;run; %if &noprint^=YES %then %do; proc freq data=&data;table &var; format &var _formr; run; %end; proc datasets dd=work nolist nowarn force nofs;delete tempo1 tempo2;run; quit; %mend;