macro boucle remplir un tableau
Bonjour.
Après maintes et maintes recherches, je fais appel à vous pour trouver une solution à mon problème.
Je possède un tableau avec des 0 et des 1 (jusque là .... ça paraît simple)
Un numéro et pour chaque numéro 5 colonnes possédant des 0 et des 1.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| data moyenne_somme;
input num somme5 somme6 somme7 somme8 somme9;
datalines;
1223 1 1 1 0 0
1303 1 0 1 1 0
1462 1 0 1 0 0
1736 1 0 1 1 0
1844 1 0 0 1 0
2104 1 1 1 1 1
2802 1 0 0 0 1
2803 1 1 0 1 0
;
run; |
L'objectif est que pour chaque numéro, à chaque fois qu'il trouve un 0 dans une colonne, il augmente la première colonne précédente différente de 0 de +1.
Par exemple la premiere ligne devrait donner pour le numéro 1223
1223 1 1 3 0 0 puisqu'il a trouvé deux 0 il a fait +1 et +1 à la première colonne précédente non nulle.
la deuxième ligne devrait donner
1303 2 0 1 2 0 puisqu'en derniere colonne il a trouvé un 0 donc il augmente l'avant derniere de 1 et qu'en seconde il a trouvé un 0 donc il augmente la première de 1.
Le tableau final doit donner :
1223 1 1 3 0 0
1303 2 0 1 2 0
1462 2 0 3 0 0
1736 2 0 1 2 0
1844 3 0 0 2 0
2104 1 1 1 1 1
2802 4 0 0 0 1
2803 1 2 0 2 0
J'ai testé plusieurs macro mais aucune ne fonctionne je ne trouve pas mon problème :
Code:
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
|
/* Test1 */
%macro moyenne2;
data moyenne_somme2;
set moyenne_somme;
%do i=6 %to 9;
if sommevfe&i.=0 then
%do j=5 %to &i.;
if sommevfe&j. ne 0 then sommevfe&j.=sommevfe&j.+1;
%end;
%end;
run;
%mend moyenne2;
%moyenne2;
/* Test2 */
%macro moyenne2;
data moyenne_somme2;
set moyenne_somme;
%let i=9;
%do %until (&i.>=6);
if sommevfe&i.=0 then
%let j=%eval(&i.-1);
%do %until (&j.>=5);
if sommevfe&j=0 then
%let j=%eval(&j.-1);
%end;
sommevfe&j.=sommevfe&j.+1;
%let i=%eval(&i.-1);
%end;
run;
%mend moyenne2;
%moyenne2;
/* test3 pour celui ci, je pense qu'il est impossible de faire une boucle sur une valeur qui n'est pas une macro variable */
%macro moyenne;
data moyenne_somme2;
set moyenne_somme;
%let j=9;
%do %until (&j.>=5);
%let k=0;
%do %until (sommevfe&j. ne 0);
%let k=%eval(&k.+1);
%let j=%eval(&j.-1);
%end;
sommevfe&j.=sommevfe&j.+&k.;
%let j=%eval(&j.-1);
%end;
run;
%mend moyenne;
%moyenne; |