Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/07/2011, 17h31   #1
Futur Membre du Club
 
Inscription : juillet 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 39
Points : 19
Points : 19
Par défaut Remplacement des cellules par la valeur précédente

Bonjour,
mon problème est simple à exposer mais apparement difficilement réalisable car cerla fait plus de 2 heures que je cherche la solution.
En fait, j'ai une variable qui s'incrémente mais qui contient des erreurs. celles-ci sont faciles à trouver, c'est à l'endroit où la variable est négative. Je cherche donc à remplacer cette valeur par la valeur précédente.
Exemple :
1
6
-2
-2
16
20
-3
21

et je souhaite obtenir
1
6
6
6
16
20
20
21

Voici mon code :
Code :
1
2
3
#data test;
IF var<0 then var=lag(var);
run;#
Merci d'avance pour votre aide
gwirionez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 18h19   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour.
LAG ne renvoie pas la valeur de l'observation précédente, mais la valeur collectée à l'occasion du précédent LAG. Donc appelé dans un IF, tu n'auras jamais la valeur attendue.
Même en sortant le LAG de son IF, il reste un problème : les valeurs négatives consécutives comme dans ton exemple.
Mieux vaut "mémoriser" la dernière bonne valeur (et la protéger avec un RETAIN) et la proposer en remplacement quand la valeur est négative.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DATA work.test ;
  INPUT var ;
DATALINES ;
1
6
-2
-2
16
20
-3
21
;
RUN ;
DATA work.rectifie (DROP=correct) ;
  SET work.test ;
  RETAIN correct ;
  IF var >= 0 THEN correct=var ;
  ELSE var=correct ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 08h51   #3
Futur Membre du Club
 
Inscription : juillet 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 39
Points : 19
Points : 19
Merci beaucoup por votre aid c'est exactement ce qu'il me fallait. En effet je n'avais absolument pas pensé au retain!!
gwirionez est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h48.


 
 
 
 
Partenaires

Hébergement Web