Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 04/11/2011, 16h54   #1
Futur Membre du Club
 
Inscription : mars 2007
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 101
Points : 15
Points : 15
Par défaut Macro : lag ne marche pas dans étape DATA

Bonjour,

Je travaille sur de la remise en forme de données d'une vieille base, pour injection dans une nouvelle BDD. Je viens vous soumettre un bug que je ne comprends pas ...

Si vous pouviez éclairer ma lanterne...

Le but de la base de données :
Préparation d'un jeu d'essai : adresse / Nom et Prénom / VILLE avec des valeurs vides sur les adresses. Les données sont triées par Nom_prénom et ville, les lignes redondantes comportent des infos que je n'ai pas à toutes les lignes (exemple un numéro de tél spécifique). Je cherche à assigner à ligne redondante (même nom et même ville) l'adresse de la ligne précédente (la première ligne a son adresse renseignée, pas les lignes redondantes).

Code :
1
2
3
4
5
6
7
8
9
10
11
DATA test2;
INFILE cards delimiter='/' MISSOVER DSD;
attrib Adresse length =$22
        NOM_PRENOM length =$12;
input Adresse $ NOM_PRENOM $ VILLE $;
cards;
2 Rue de la République/Jean Dupont/PARIS
/Jean Dupont/PARIS
Boulevard de Gaulle/Marc Desbois/RENNES
;
run;
Essai1 : avec une affectation directe par LAG. Ne fonctionne pas.
Code :
1
2
3
4
5
6
7
DATA test;
SET test;
/*restitue l'adresse courante*/
IF lag(NOM_Prenom) EQ NOM_Prenom  AND lag(VILLE) EQ VILLE AND missing(adresse) then do;
adresse=lag(adresse);
end;
run;
Essai2 : en utilisant une macro variable stockée. Fonctionne.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
DATA test;
SET test;
/*restitue l'adresse courante*/
IF lag(NOM_Prenom) EQ NOM_Prenom  AND lag(VILLE) EQ VILLE AND missing(adresse) then do;
adresse=symget('mavar');
end;
 
else do;/*on stocke l'adresse courante*/
call symputx('mavar',adresse);
end;
 
run;
Pourquoi l'affectation via LAG ne fonctionne pas ?

Merci beaucoup, cela défie ma logique et je me creuse la tête en vain...
cladoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 17h07   #2
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 012
Points : 1 713
Points : 1 713
Essai de passer par une jointure horizontale ( merge) sur la même table , en commençant la decture de la deuxième table de la ligne2 c-à-d FIRSTOBS=2.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2011, 11h26   #3
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
Citation:
Envoyé par cladoo Voir le message

Essai1 : avec une affectation directe par LAG. Ne fonctionne pas.
Code :
1
2
3
4
5
6
7
DATA test;
SET test;
/*restitue l'adresse courante*/
IF lag(NOM_Prenom) EQ NOM_Prenom  AND lag(VILLE) EQ VILLE AND missing(adresse) then do;
adresse=lag(adresse);
end;
run;
Pourquoi l'affectation via LAG ne fonctionne pas ?

Merci beaucoup, cela défie ma logique et je me creuse la tête en vain...
mais c'est parce que c'est ainsi que fonctionne SAS : des structures :
Code :
1
2
3
4
 
IF .... THEN x=LAG(y) ;
ou
IF ... THEN X=Z;ELSE X=LAG(Y) ;
ne peuvent pas fonctionner.

Petit exemple simple tiré de mon bouquin (cadeau !)
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
 
*Programme 3.72 ;
 
DATA test;
   INPUT x y;
CARDS;
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
;RUN;
 
PROC SORT DATA=test;
   BY x y;
RUN;
 
DATA test;SET test;
   BY x y;
   IF first.x THEN eca_y=y;
   ELSE eca_y=y-LAG(y);
RUN;
Si on ne comprend pas bien le fonctionnement de SAS et les conséquences du traitement "à la volée" des observations de la table source, on peut s'attendre à ce que ce eca_y soit systématiquement égal à 1.

Ce n'est pas le cas puisqu'on obtient :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Obs    x    y    eca_y
 
  1    1    1       1
  2    1    2       .
  3    1    3       1
  4    1    4       1
  5    2    1       1
  6    2    2      -2
  7    2    3       1
  8    2    4       1
  9    3    1       1
 10    3    2      -2
 11    3    3       1
 12    3    4       1
Ce programme devrait en revanche fonctionner :

[code]
Code :
1
2
3
4
5
6
7
8
DATA test;
SET test;
/*restitue l'adresse courante*/
adresse_tmp=lag(adresse);
IF lag(NOM_Prenom) EQ NOM_Prenom  AND lag(VILLE) EQ VILLE AND missing(adresse) then do;
adresse=adresse_tmp;
end;
run;
a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/11/2011, 09h36   #4
Futur Membre du Club
 
Inscription : mars 2007
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 101
Points : 15
Points : 15
Bonjour à tous les 2, merci, je comprends mieux.

z6c3po > je n'ai aucune excuse puisque je possède votre bouquin
cladoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2011, 20h10   #5
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
Citation:
Envoyé par cladoo Voir le message
Bonjour à tous les 2, merci, je comprends mieux.

z6c3po > je n'ai aucune excuse puisque je possède votre bouquin
c'est du propre ! ;-)

a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 13h15   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
il faut sortir le lag du IF
Exemple qui fonctionne.
Code :
1
2
3
4
5
6
7
8
9
10
 
DATA test;
SET test2;
	ladr=lag(adresse);
IF lag(NOM_Prenom) EQ NOM_Prenom  AND lag(VILLE) EQ VILLE AND Adresse eq ""  then do;
	put 'hello' _n_ adresse ladr;
	adresse=ladr;
end;
 
run;
Cordialement
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est actuellement 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 14h15.


 
 
 
 
Partenaires

Hébergement Web