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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
Partager