1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
%macro remplacer_modalites(seuil=,table_source=,table_sortie=,list_varact=);
%macro zut; %mend zut;
/* ces lignes comptent le nombre de variables actives de la liste */
%global count;
%let count=0;
%do %while(%qscan(&list_varact,&count+1,%str( )) ne %str());
%let count = %eval(&count+1);
%end;
%put Il y a donc &count variables actives. La liste en est "&list_varact";
/* puis on execute le programme pour chacune d'entre elle */
%do z=1 %to &count;
%let varact=%scan(&list_varact,&z,' ');
%put La variable active traitée est "&varact";
/* STOP - Jusqu'ici, on peut travailler sur chacune des variables appelées par la MV &varact */
proc freq data=&table_source;
table &varact / missing out=freq_&varact;
run; quit;
/* Création de la liste des modalités à conserver intactes */
%global list_modcons nbmodcons;
%let list_modcons="";
proc SQL NOPRINT;
SELECT QUOTE(COMPRESS(&varact)) INTO: list_modcons SEPARATED BY ',' FROM freq_&varact WHERE percent > &seuil;
quit;
%let nbmodcons = &sqlobs;
%put Pour la variable &varact, la liste des modalités à conserver est (&list_modcons);
%put Il y en a &nbmodcons;
/* Création de la liste des modalités à remplacer */
%global list_modelim nbmodelim;
%let list_modelim=""; %let nbmodelim=0;
proc SQL NOPRINT;
SELECT QUOTE(COMPRESS(&varact)) INTO: list_modelim SEPARATED BY ',' FROM freq_&varact WHERE &varact not in (&list_modcons);
quit;
%let nbmodelim = &sqlobs;
%if &nbmodelim>0 %then %do;
%put Pour la variable &varact, la liste des modalités à éliminer est (&list_modelim);
%put Il y en a &nbmodelim;
%end;
%else %do;
%put "Il n'y a aucune modalité à éliminer pour la variable" &varact;
%end;
/* Création des modalités remplaçantes */
data _null_; set freq_&varact;
where &varact in (&list_modcons);
call symputx(compress("modcons"!!_N_),&varact);
run;
/* Boucle pour chacune des modalités à remplacer */
%if &nbmodelim>=1 %then %do;
data &table_sortie; set &table_source;
x=rand('uniform');
%do y=1 %to &nbmodcons;
if &varact in (&list_modelim) and %sysevalf((&y-1)/&nbmodcons)<=x<=%sysevalf(&y/&nbmodcons) then do;
&varact.a = "&&&modcons&y"; /* pour tableau croisé de vérification */
&varact = "&&&modcons&y";
end;
%end;
drop x;
run;
%put _user_;
%end;
proc freq data=&table_sortie; table &varact*&varact.a / missing; run; quit;
%end;
%mend remplacer_modalites;
%remplacer_modalites(
table_source=acmv2,
table_sortie=out,
seuil=3,
list_varact=
aepp areso aenseign acmu apatvi aenf atpsjw
anbjw avacan aperm ardv agroup ainfo aechmg aechms aechin
asoll amepspe adiver
); |
Partager