Votre question

Problème de boucle en SAS

Tags :
  • table
  • Programmation
Dernière réponse : dans Programmation
9 Août 2007 17:02:56

Bonjour à tous,
Laissez moi vous exposer mon problème.

Voici le contenu de la table Pwl:
ID Prob Valeur
1 20% 4
1 40% 5
1 60% 6
1 70% 7
1 80% 8
1 90% 9
1 100% 10
2 20% 3
2 40% 4
2 80% 5
2 90% 6
2 100% 7
3 10% 1
3 20% 2
3 40% 4
3 60% 6
3 80% 8
3 100% 10

Je souhaite à partir de la table Pwl sélectionner les observations ayant un ‘Id’ que je me fixe. Parmi les observations retenues je souhaite ne considérer que celles dont la ‘Prob’ est supérieure à une variable aléatoire tirée uniformément entre 0 et 1. Enfin je ne veux conserver que la première observation de toutes celles restantes.
Il me faut répéter cette opération un grand nombre de fois.

J’ai écrit deux étapes data qui devraient, selon moi, donner la même chose.
Pourtant la première me donne le résultat attendu alors que la seconde non.

La première étape data est la suivante :

data Res2;
%let Param=1;
set Pwl(where=(Id=%sysevalf(&Param,Integer) & Prob>ranuni(-1)) obs=1);
output;
%let Param=1;
set Pwl(where=(Id=%sysevalf(&Param,Integer) & Prob>ranuni(-1)) obs=1);
output;
%let Param=1;
set Pwl(where=(Id=%sysevalf(&Param,Integer) & Prob>ranuni(-1)) obs=1);
output;
run;

La seconde étape data est la suivante :

data Res1;
do i=1 to 3;
%let Param=1;
set Pwl(where=(Id=%sysevalf(&Param,Integer) & Prob>ranuni(-1)) obs=1);
%put Une boucle;
output;
end;
run;

Problème : La boucle do n’est parcourue qu’une seule fois…

Merci par avance de l'aide que vous pourrez m'apporter!!

Autres pages sur : probleme boucle sas

a c 232 L Programmation
10 Août 2007 01:06:40

Je ne connais pas le langage dans lequel tu programmes, mais, tu utilises une boucle avec une variable i, mais tu ne l'utilises pas dans ton set, est-ce que c'est normal ?
Ta boucle n'est là que pour exécuter exactement la même chose 3 fois, sans aucun changement ?
11 Août 2007 08:16:48

Si par exemple j'execute le code suivant:

data Res1;
do i=1 to 3;
output;
end;
run;

La table Res1 contiendra la variable i qui prendra bien les valeurs 1,2 et 3.
Donc la boucle fonctionne bien même si l'indice n'est pas utilisé à l'intérieur de la boucle...

En effet la bouble n'est là que pour refaire la même chose plusieurs fois.
Sauf qu'à chaque passage de la boucle ranuni(-1) me tire aléatoirement une variable uniforme entre 0 et 1 différente. Enfin si ca fonctionnait c'est ce que ca ferais!

Une idée?

Contenus similaires
11 Août 2007 12:50:45

Tu peux tester le retour de PWL ?
Je ne connais pas ce langage de programmation, par contre, si ta requete génére "une exception" (ou equivalent en SAS) , ca peut être bloquant.

Je prends l'analogie en C/C++ pour les requetes, il vaut mieux libérer la requete précédente avant d'en relancer une .. (exemple avec des liaison PGSQL:
=> PQclear(res);


Si tu n'apelles pas cette fonction, ta requete suivante (entre autres dans le cas d'une boucle) sera problématique!
a c 232 L Programmation
11 Août 2007 16:33:09

J'ai essayé de me documenter un peu sur le SAS (ouah...).

Donc, si j'ai bien compris, le %put devrait t'afficher le résultat d'une variable ou du texte, dans ta boucle, "Une boucle" n'est affichée qu'une seule fois, ou trois fois ?
14 Août 2007 18:31:46

Bonsoir,

Je ne sais pas la cause du probleme. Peut-etre que les membres du forum SAS-L pourront t'en dire plus si tu prends la peine d'ecrire en anglais. http://www.listserv.uga.edu/archives/sas-l.html

Pour ma part, j'aurais programme ainsi apres un proc sort:

data Res3;
set Pwl (where=(Prob>ranuni(-1)));
by id;

if first.id then output;
run;

Tu noteras que je n'ai pas utilise ta macro fonction car je ne sais pas ce qu'elle fait et a quoi elle sert dans ton cas.

Envois un message si tu as resolu ton probleme ;) 

veronique
16 Août 2007 12:28:10

Pour répondre à OmaR_ShaRi...
J'ai mis ce %put afin d'avoir un indicateur qui me permette de savoir combien de fois est exécutée ma boucle.
Et en effet "Une boucle" ne s'affiche qu'une fois...
16 Août 2007 12:33:19

Pour répondre à vero_979...
Je ne peux pas utiliser de proc sort car en fait je compte utiliser ce code à l'intérieur d'une étape data et il aurait fallu faire le proc sort avant mais cela m'est impossible.
Dans ton code je ne vois pas comment choisir la valeur de id que je souhaite retenir.
Ma macro fonction %put me sert juste de controle.

Merci à vous deux de m'aider.
a c 232 L Programmation
16 Août 2007 15:11:56

D'après les documents que j'ai regardé, je ne comprend pas pourquoi les deux portions de code que tu nous as donné ne font pas la même chose.
Désolé, je ne peux pas plus t'aider.
26 Mars 2008 09:12:39

teste le code ci aprés:


%macro une_macro;
data Res1;
%do i=1 %to 3;
%let Param=1;
set Pwl(where=(Id=%sysevalf(&Param,Integer) & Prob>ranuni(-1)) obs=1);
output;
%put Une boucle&i;
%end;
run;
%mend;
%une_macro;
19 Novembre 2008 16:39:05

En effet il fallait utiliser une macro boucle.
Merci! :) 
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS