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