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 12/12/2011, 11h34   #1
Invité régulier
 
Inscription : décembre 2008
Messages : 14
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : décembre 2008
Messages : 14
Points : 5
Points : 5
Par défaut Boucle dans SAS

Bonjour,
je n'arrive pas à faire ma boucle dans une étape data.
J'ai 19 variables (MA1 - MA19) qui prennent les valeurs 0 ou 1 (non/oui) et je souhaite vérifier à l'aide d'un test que d'autres valeurs n'ont pas été saisies par erreur :

Code :
1
2
3
4
5
 
DATA titi;
SET titi;
IF MA1 NOT IN (0,1) then MA1 =.;
run;
Je souhaiterais réaliser une boucle pour ces 19 variables.
Je précise que pour le moment j'utilise une petite macro :

Code :
1
2
3
4
5
6
7
 
%MACRO zero_un (tab2,tab1,var);
DATA &tab2;
SET &tab1;
IF &var NOT IN (0,1) then &var=.;
run;
%MEND zero_un;
ce qui fait :
Code :
%zero_un (c_obs,c_obs,ma1);
Je sèche sur la création de cette boucle, pourriez-vous m'aider ?
Marie33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h44   #2
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 73
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 73
Points : 32
Points : 32
Bonjour,

Avec une boucle do i = 1 to 19 dans une étape data cela devrait faire ce que tu souhaites :

Code :
1
2
3
4
5
6
7
8
DATA titi;
SET titi;
 
DO i = 1 TO 19 ;
   IF MA&i. NOT IN (0,1) then MA&i. =.;
END ;
 
run;
Bonne journée.
mohamed_ est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 12/12/2011, 12h23   #3
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 150
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 150
Points : 1 772
Points : 1 772
Bonjour,

Pas sur que ca marche comme ca.

je propose de passer en mode macro:

Code :
1
2
3
4
5
6
7
8
9
10
11
%macro titimac;
DATA titi;
SET titi;
 
%DO i = 1 %TO 19 ;
   %IF MA&i. NOT IN (0,1) %then MA&i. =.;
%END ;
 
run; 
%mend titimac;
%tititmac;
autre solution:


Code :
1
2
3
4
5
6
7
8
9
%MACRO zero_un (var=);
IF &var NOT IN (0,1) then &var=.;
%MEND zero_un; 
 
DATA titi2;
SET titi;
%zero_un (var=ma1);
/*et ainsi de suite*/
run;
Les deux solutions sont non testees mea culpa si ya une coquille qui traine!
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h28   #4
Invité régulier
 
Inscription : décembre 2008
Messages : 14
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : décembre 2008
Messages : 14
Points : 5
Points : 5
Par défaut Ca ne fonctionne pas hélas !

Code :
1
2
3
4
5
6
7
 
DATA titi;
SET titi;
DO i = 1 TO 19 ;
   IF MA&i. NOT IN (0,1) then MA&i. =.;
END ;
run;
Voici le message dans la log :
Code :
1
2
3
4
5
6
7
8
WARNING: Référence symbolique apparente I non traitée.
WARNING: Référence symbolique apparente I non traitée.
ERROR 22-322: Erreur de syntaxe ; syntaxe requise : un nom, une chaîne entre guillemets, une constante numérique,
              une constante date temps, une valeur manquante, arrayname, (, +, -, INPUT, NOT, PUT, ^, _NEW_, ~.
 
ERROR 180-322: Instruction incorrecte ou mal utilisée.
 
ERROR 201-322: L'option n'est pas reconnue et sera ignorée.
Merci quand même pour ta réponse (et je suis preneuse si tu as une autre solution!)
Marie33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h38   #5
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 717
Points : 1 717
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
 
 
DATA tab1;
input var1-var3;
cards;
0 1 0
0 0 1
0 2 1
2 0 1
1 1 1 
0 0 0 
2 2 2
;
run;
 
 
DATA tab2 (DROP= i);
   SET tab1;
   array x (3)var1-var3;
      do i=1 TO dim(x);
         IF x(i)  IN(0,1);
      end;
 
run;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h40   #6
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 717
Points : 1 717
sorry,
une petite correction :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
 
DATA tab2 (DROP= i);
   SET tab1;
   array x (3)var1-var3;
      do i=1 TO dim(x);
         IF x(i)   NOT IN(0,1) then do;
        x(i)=.;end;
      end;
 
run;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 12/12/2011, 14h11   #7
Invité régulier
 
Inscription : décembre 2008
Messages : 14
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : décembre 2008
Messages : 14
Points : 5
Points : 5
Par défaut Merci ça marche !

Citation:
Envoyé par s_a_m Voir le message
sorry,
une petite correction :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
 
DATA tab2 (DROP= i);
   SET tab1;
   array x (3)var1-var3;
      do i=1 TO dim(x);
         IF x(i)   NOT IN(0,1) then do;
        x(i)=.;end;
      end;
 
run;
Voilà qui va me faire gagner du temps et des lignes de programmes !
Marie33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 14h18   #8
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 828
Points : 2 828
Le même sans compteur de boucle (qui ne sert pas spécialement dans cette problématique) :
Code :
1
2
3
4
5
6
7
DATA tab2 ;
   SET tab1;
   array x var1-var3;
      do OVER x ;
         IF x NOT IN(0,1) then x=.;
      end;
run;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h30.


 
 
 
 
Partenaires

Hébergement Web