Bonjour,
Je pense qu'il faut passer par un compteur. Je propose une approche en quatre étapes :
- Sauvegarder le numéro de trimestre et l'année dans deux variables différentes
- Remplacer les valeurs manquantes pour le trimestre
- Remplacer les valeurs manquantes pour l'année
- Remettre les informations dans une seule variable.
Dans un premier temps, je te propose des détails sur l'approche. Dans un second temps, tu trouveras le code.
Véronique
_____________________________
Véronique Bourcier
veronique.bourcier@sasreference.fr
www.sasreference.fr
Blog pour se former au logiciel SAS
1. Variables trimestre et année
J'ai assumé que la variable A était numérique puisque les valeurs manquantes sont symbolisées par des points. Si ce n'est pas le cas, il faudra faire appel aux fonctions caractères de SAS pour extraire le trimestre et l'année.
Pour créer la variable TRIMESTRE, je divise le nombre par 10 000 pour n'avoir que le chiffre correspondant au trimestre dans la partie entière et je garde la partie entière avec la fonction FLOOR.
Pour créer la variable ANNEE, j'enlève le numéro du trimestre multiplié par 10 000.
Je n'opère l'opération que pour les valeurs non manquantes de A en utilisant la fonction MISSING.
2. Un compteur pour le semestre.
Si la valeur A est manquante j'ajoute 1 à la dernière valeur lue par SAS.
Si la valeur actualisée est égale à 5 alors, le numéro du trimestre est réinitialisé.
3. Un compteur pour l'année
A chaque fois que A est manquant et que le trimestre est 1, j'ajoute 1 à l'année. Sinon, j'utilise la dernière valeur allouée à la variable ANNEE.
4. Recréer la variable A
La variable A est actualisée : trimestre * 10 000 + annee.
Les variables TRIMESTRE et ANNEE sont supprimées n'étant plus nécessaires.
a. Créer le data set pour l'exemple
1 2 3 4 5 6 7 8 9 10 11 12 13
| data orig;
input A B C;
datalines;
22007 456 451.123
32007 468 466.456
42007 480 474.563
12008 486 484.756
22008 486 486.359
. . 482.865
. . 474.123
. . 496.263
;
run; |
b. Les 4 étapes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| data final (drop=trimestre annee);
set orig;
*Etape 1;
if not missing(a) then
do;
trimestre=floor(a/10000);
annee=a-trimestre*10000;
end;
*Etape 2;
if missing(a) then trimestre+1;
if trimestre=5 then trimestre=1;
*Etape 3;
if missing(a) and trimestre=1 then annee+1;
*Etape 4;
a=trimestre*10000+annee;
run; |
c. Visualiser le résultat
1 2
| proc print data=final;
run; |
Partager