Bonjour,

Voici la table 1 (j'ai remplacé les valeurs manquantes par un "?" pour plus de lisibilité :

MOIS VAR1 VAR2
Janvier 20 10
Février 30 8
Mars 25 ?
Avril ? ?
Mai 30 ?
Juin 31 ?
Juillet 34 12
Août 35 9
Septembre 40 7
Octobre 38 9
Novembre ? 10
Décembre ? 11


Voici la table 2 (résultat que j'aimerai obtenir):

MOIS VAR1 VAR2
Janvier 20 10
Février 30 8
Mars 25 8
Avril 25 8
Mai 30 8
Juin 31 8
Juillet 34 12
Août 35 9
Septembre 40 7
Octobre 38 9
Novembre ? 10
Décembre ? 11

pour le moment je ne sais pas comment dire à SAS comment s'arreter pour les dernieres valeurs de la variable VAR1 - Je veux que SAS remonte la valeur précédente si VAR1=. et que la valeur précédente >0 et valeur suivante (m+1ou m+2 ou m+3...) >0.

Pour le moment mon code est :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
%macro vv(var)
DATA Table3 (DROP=prov);
SET Table1
/* retient la valeur précédente */
retain prov;
/* remplace les données manquantes */
IF &var.=. then &var.=prov;
prov=&var.;
run;
%mend;
%vv (VAR1);
%vv (VAR2);
avec ce code j'obtiens la table3 :
MOIS VAR1 VAR2
Janvier 20 10
Février 30 8
Mars 25 8
Avril 25 8
Mai 30 8
Juin 31 8
Juillet 34 12
Août 35 9
Septembre 40 7
Octobre 38 9
Novembre 38 10
Décembre 38 11

Je ne veux pas qu'il me remplace les valeurs manquantes par les chiffres en violets car il n'y a plus de valeur après octobre pour la Variable VAR1.


Merci de votre aide

-----------

Je viens de trouver la réponse à mon pb. le code est le suivant (mais avec ce code, ça ne marche plus avec la VAR2) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
%macro vv(var)
DATA Table2/*(DROP=prov)*/;
SET Table1;
/* retient la valeur précédente */
retain prov;
dd=dif(&var.);
/* remplace les données manquantes */
IF &var.=. and dd ne . then &var.=prov;
prov=&var.;
run;
%mend;
%vv(VAR1);
%vv(VAR2);


---------
J'ai ajouté cette ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
If &Var.=. and last.&Var.=. then &Var.=.;
ça marche pour le cas ci dessus (VAR 1 er 2) mais si l'on a les deux contraintes dans une meme variable ça ne va plus marcher.