Vous n'êtes pas identifié.
Vous êtes sur le forum du master ESA !
Le site du master ESA - description de la formation, notes de cours, contacts... vient de déménager !!!
Venez visiter notre nouveau site : www.master-esa.fr
bonjour,
une ancienne étudiante vient de me contacter et me propose le problème suivant :
elle dispose d'une table comprennant 37 variables - la première variable saisie le nom de la commune, les 36 autres indiquent le nombre de salariés, habitant de la commune et travaillant dans les secteurs 1, 2,3... 36
le programme suivant vous crée une table fictive :
DATA test; INPUT COMM $; ARRAY nes NES1-NES36; DO i=1 TO 36; NES(i)=ROUND(RANUNI(1234)*1000,1); END; CARDS; a b c d e f ;RUN;
pour obtenir :
Obs COMM NES1 NES2 NES3 NES4 NES5 ..... 1 a 244 89 383 98 258 2 b 546 978 535 421 493 3 c 153 524 381 911 275 4 d 557 916 295 111 873 5 e 429 658 862 61 85 6 f 551 286 378 144 521
Elle souhaite créer 5 nouvelles variables SECT1-SECT5 qui reprendront les cinq valeurs maximales parmi NES1-NES36 (soit 967 906 906 798 773) pour l'individu a) et cinq autres nouvelles variables SECT_T1-SECT_T5 qui reprendront en toutes lettres les noms des variables correspondants au maximum ( NES15 NES14 NES29 NES31 NES36 pour l'individu a).
Pas besoin de PROC TRANSPOSE, de PROC UNIVARIATE, ni de macro - une simple étape DATA suffit.
petite question bonus.
modifiez votre table initiale de la façon suivante :
DATA test; SET test; IF comm='a' THEN nes1=906; RUN;
Relancez le programme que vous venez d'écrire pour répondre aux questions posées - il est possible que NES1 ne soit pas modalité de SECT_T1 ou SECT_T2...
(ce problème de doublon se pose en fait avant même la modification apportée par le programme ci-dessus pour les individus a, b et f - si vous avez réglé ce problème dès le départ, la modification doit vous permettre de voir si vous savez aussi traiter correctement le problème en cas de triplon...)
amusez vous bien
cordialement
SR
Hors ligne
Si j'ai bien compris le problème ce prog devrait fonctionner pour la première partie.......pour la suite, on verra une autre fois......la pause est finie...
proc sort data = test; by comm; run; data test2; set test; array nes NES1-NES36; by comm; retain sect1 0; do i=1 to 36; if NES(i) > sect1 then do; sect1 = NES(i); sect_t1 = compress('NES'!!i); end; if sect1 > NES(i) > sect2 then do; sect2 = NES(i); sect_t2 = compress('NES'!!i); end; if sect2 > NES(i) > sect3 then do; sect3 = NES(i); sect_t3 = compress('NES'!!i); end; if sect3 > NES(i) > sect4 then do; sect4 = NES(i); sect_t4 = compress('NES'!!i); end; if sect4 > NES(i) > sect5 then do; sect5 = NES(i); sect_t5 = compress('NES'!!i); end; end; if last.comm then do; output; sect1 = 0; sect2 = 0; sect3 = 0; sect4 = 0; sect5 = 0; end; run;
Cdt.
Hors ligne
Euh .... en fait, je crois que le retain sert à rien dans mon truc.........
Hors ligne