Tom's Guide > Forum > Programmation > Problème de boucle en SAS
Mot :    Pseudo :           
 

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!!

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.
- 0 +

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 ?

Répondre à OmaR

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?

Répondre à aure-b

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!

Répondre à elendilm
- 0 +

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 ?

Répondre à OmaR

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


Message édité par vero_979 le 14-08-2007 à 18:32:53
Répondre à vero_979

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...

Répondre à aure-b

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.

Répondre à aure-b
- 0 +

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.

Répondre à OmaR

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;

Répondre à delmat

En effet il fallait utiliser une macro boucle.
Merci! :)

Répondre à aure-b
Tom's Guide > Forum > Programmation > Problème de boucle en SAS
Aller à :

Il y a 204 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens