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 27/04/2011, 10h54   #1
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Par défaut Création d'une nouvelle variable avec utilisation de boucles, retain etc

Bonjour,

Voici mon problème :

J'ai une colonne avec des numéros de patients et leurs dates d'admission. Je voudrais créer une colonne qui dise si le patient était déjà venu auparavant.
Dans ce cas, si oui alors la dernière colonne associée à la ligne aurait un 1 sinon un 0.


Par ex (en supposant que le tableau a préalablement été trié en fonction du numpat grâce à une proc sort) :

numpat Date_Admission Deja_Existant


1 20/03/2004 0
2 20/03/2004 0
384 20/03/2004 0
1 21/04/2004 1

Voilà en gros ce que je voudrais obtenir.
Mais comment y parvenir?

On m'a dit de procéder de la façon suivante :
- proc sort by numpat
- retain (je ne sais pas comment l'utiliser ici)
- boucle.


Merci d'avance.
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h07   #2
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Et cette méthode ne te convient pas?

Je propose une autre piste via la proc sql, ou je pense tout peut être géré en une seule étape:

dans le select, comparer le si min(date)<= date et renvoyer 1 si C'est le cas, 0 sinon (faire la comparaison par patient). Attention aux valeurs manquantes.

solution (non testée):

Code :
1
2
3
4
5
6
7
proc sql;
CREATE TABLE testdatemin AS
SELECT *, (date>(min(date))) AS testdate
FROM tableorig
GROUP BY patient;
;
quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h57   #3
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Oui cela a fonctionné! Mais bon sql n'a jamais été mon fort!
Merci beaucoup!

Tant que j'y suis : si je veux faire la même chose mais voir si le patient a été admis 8 jours avant, comment faire pour modifier le programme?

En gros (retranscription d'excel)

Code :
Si (numpat i +1 = numpat alors si date_adm i +1 <= date_adm alors 1 sinon 0) sinon 0)
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h59   #4
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Ps : j'ai oublié les i après les numpat et date_decision
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h08   #5
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
si je comprends bien tu veux tester si le patient à été admis il y a au moins 8 jours (?)
Code :
1
2
3
4
5
6
7
8
 
proc sql;
CREATE TABLE testdatemin AS
SELECT *, (date>(min(date))) AS testdate,(date>(min(date)+7)) AS test8jours
FROM tableorig
GROUP BY patient;
;
quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h12   #6
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Pardon, j'ai écrit n'importe quoi dans le message précédent!

Voici la formule Excel :
Code :
=SI(C3=C2;SI(D3-D2<=8;1;0);0)
Avec C = Numéro du patient et D = Date d'admission

Oui c'est savoir si le patient a déjà été admis dans les 8 jours qui ont précédé la nouvelle admission.
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h16   #7
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Evite les formules excel, c'est plus simple de formaliser ton problème par écrit.

Mon code te renvoie 1 pour la nouvelle variable s'il à été admis il y a 8 jours ou plus.

Quand à sql, je ne peux que te le conseiller, la syntaxe est simple pour qui s'y penche. Tu devrais t'en sortir facilement.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h37   #8
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Le code devrait renvoyé 0 dans ce cas là, et si l'ancienne admission est inf ou égale à 8jours alors 1.
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h40   #9
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Donc tu ferais comment? En connectant tes neurones tu vas y arriver
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h52   #10
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Oui je crois ^^ Mais mon cerveau est fatigué xd
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h11   #11
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Voilà, j'ai modifié le programme lequel fonctionne à l'exception de quelque chose : si c'est la première admission alors il devrait y avoir un 0 et non pas un 1 ... Sas considère le contraire.
Je peux ajouter une clause d'exception? Et si oui, par quel moyen??
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h14   #12
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
C'est normal.

tu me dis:
Citation:
Le code devrait renvoyé 0 dans ce cas là, et si l'ancienne admission est inf ou égale à 8jours alors 1.
donc ca inclue la première admission qui est inférieure à 8 jours de la première admission.

Je suppose que tu veux les dates comprises entre 1 et 7 jours de la première admission.

essaye ca:
Code :
1
2
3
4
5
6
7
8
 
proc sql;
CREATE TABLE testdatemin AS
SELECT *, (date>(min(date))) AS testdate,(min(date)<date<(min(date)+8)) AS test8jours
FROM tableorig
GROUP BY patient;
;
quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h16   #13
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Voilà c'est ça, il faut exclure la première admission.
Je teste et je te dis
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h25   #14
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Non il y a un souci. Certaines obs où je devrais avoir un 1 marquent 0...
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h29   #15
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
si tu ne décris pas ton problème clairement, on ne peux pas t'aider. que veux tu faire précisément? quel est ton problème?
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h41   #16
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Et bien là j'ai changé le LT en LE, ca arrange vite fait les choses mais bon c'est pas normal. Voilà une ébauche de ce que je cherche à obtenir :

numpat Date_Adm 8j

1 28FEB2009 0
2 05JUN2005 0
3 22JAN2008 0
4 09APR2004 0
4 09JUL2006 0
4 10JUL2006 1
4 04DEC2006 0
4 07DEC2006 1
4 28FEB2008 0
4 28MAY2009 0
5 01JUL2008 0
5 04JUL2008 1
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h47   #17
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Voilà ce que j'obtiens à la dernière colonne avec la formule :

Code :
1
2
3
4
5
6
7
proc sql;
CREATE TABLE stage.Deja_Existant8j AS
SELECT *, (D_Date_AdmissionUrgence>(min(D_Date_AdmissionUrgence))) AS Deja_Existant,(min(D_Date_AdmissionUrgence)LT D_Date_AdmissionUrgence LT (min(D_Date_AdmissionUrgence)+8)) AS Deja_Existant8jours
FROM stage.Deja_Existant
GROUP BY numpat;
;
quit;

Deja_Existant8j


0
0
0
0
0
0
0
0
0
0
0
1
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h49   #18
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
on va récuperer la date d'entrée par patient. C'est peut être le codage (min(date)<date<(min(date)+8)) qui marche pas.

Code :
1
2
3
4
5
6
7
proc sql;
CREATE TABLE testdatemin AS
SELECT *, (date>(min(date))) AS testdate,(min(date)<date<(min(date)+8)) AS test8jours,(min(date)<date AND date<(min(date)+8)) AS test8jours2, min(date) AS mindate
FROM tableorig
GROUP BY patient;
;
quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h55   #19
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
C'est peut être un soucis de parenthèses:
Code :
1
2
3
4
5
6
7
proc sql;
CREATE TABLE testdatemin AS
SELECT *, (date>(min(date))) AS testdate,(min(date)<date<min(date)+8) AS test8jours,(min(date)<date AND date<min(date)+8) AS test8jours2, min(date) AS mindate
FROM tableorig
GROUP BY patient;
;
quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h58   #20
Invité régulier
 
Inscription : avril 2011
Messages : 53
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 53
Points : 6
Points : 6
Alors cela n'a rien changé à la variable test8j qui est exactement = à test8j_2
Et une variable mindate s'est créée avec les valeurs numériques correspondant à la date du jour je suppose?

C'est le M....
avalen est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h08.


 
 
 
 
Partenaires

Hébergement Web