IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Création d'une nouvelle variable avec utilisation de boucles, retain etc


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    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.

  2. #2
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Si (numpat i +1 = numpat alors si date_adm i +1 <= date_adm alors 1 sinon 0) sinon 0)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Ps : j'ai oublié les i après les numpat et date_decision

  5. #5
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    si je comprends bien tu veux tester si le patient à été admis il y a au moins 8 jours (?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Pardon, j'ai écrit n'importe quoi dans le message précédent!

    Voici la formule Excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =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.

  7. #7
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    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.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Le code devrait renvoyé 0 dans ce cas là, et si l'ancienne admission est inf ou égale à 8jours alors 1.

  9. #9
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Donc tu ferais comment? En connectant tes neurones tu vas y arriver

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Oui je crois ^^ Mais mon cerveau est fatigué xd

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    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??

  12. #12
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    C'est normal.

    tu me dis:
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Voilà c'est ça, il faut exclure la première admission.
    Je teste et je te dis

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Non il y a un souci. Certaines obs où je devrais avoir un 1 marquent 0...

  15. #15
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    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?

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    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

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Voilà ce que j'obtiens à la dernière colonne avec la formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  18. #18
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  19. #19
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    C'est peut être un soucis de parenthèses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    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....

Discussions similaires

  1. Création d'une nouvelle variable
    Par Sokol dans le forum SAS Base
    Réponses: 1
    Dernier message: 25/10/2013, 18h26
  2. Création d'une nouvelle table avec un nom préconfiguré
    Par myrddin99 dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/04/2012, 14h33
  3. Création d'une liste déroulante avec une variable
    Par lou87 dans le forum ASP.NET Ajax
    Réponses: 1
    Dernier message: 12/01/2011, 15h18
  4. Création d'une nouvelle page avec ACA
    Par webvince18 dans le forum C#
    Réponses: 0
    Dernier message: 25/09/2009, 14h47
  5. pb avec la requête "création d'une nouvelle table"
    Par fab4_33 dans le forum Access
    Réponses: 4
    Dernier message: 03/02/2006, 17h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo