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 :

Parcourir une table SAS


Sujet :

SAS Base

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Par défaut Parcourir une table SAS
    Bonjour,

    J'ai une table qui contient des observations, certaines sont manquantes et d'autres renseignées. Ces observations sont classées par ordre chronologique.

    Je voudrais créer une variable qui m'indique toutes les observations bornées par la première observation renseignée et la dernière, pour chaque identifiant.
    La difficulté est que la dernière observations n'est pas forcément celle qui est suivie d'une valeur manquante ou du nouvel identifiant. Un exemple pour clarifier les choses:

    Voici à quoi ressemble la table en entrée:
    Année ID valeur
    1998 1 .
    1999 1 .
    2000 1 2
    2001 1 3
    2002 1 4
    2003 1 5
    2004 1 .
    1998 2 1
    1999 2 .
    2000 2 2
    2001 2 .
    2002 2 4
    2003 2 5
    2004 2 .

    J'aimerais en résultat obtenir une table de la forme:

    Année ID valeur tag
    1998 1 . 0
    1999 1 . 0
    2000 1 2 1
    2001 1 3 1
    2002 1 4 1
    2003 1 5 1
    2004 1 . 0
    1998 2 1 1
    1999 2 . 1
    2000 2 2 1
    2001 2 . 1
    2002 2 4 1
    2003 2 5 1
    2004 2 . 0

    En fait, je souhaite imputer des valeurs aux seules observations qui sont "encadrées" par des observations renseignées.
    En gros, je suppose que la première fois qu’apparaît une observation pour un individu son activité démarre, la dernière fois
    sont activité s'éteint et entre les deux, c'est un problème de report des données que je vais imputer. En dehors, c'est des "vraies" valeurs manquantes qu'il faut conserver telle quelle.

    Merci par avance

  2. #2
    Membre émérite
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Par défaut
    C'est un problème que je te propose de résoudre en étapes data avec :
    - le "retain"
    - deux tris successifs, ascendants puis descendants

    En premier, identification des "non démarrés" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    proc sort data = test ; by ID annee ; run ;
    data test ; 
        set test ;
        by ID annee ;  
        retain TP_NON_DEMARRE ;
        if first.ID then TP_NON_DEMARRE = 1 ;
        if not missing (valeur) then TP_NON_DEMARRE = 0 ;
    run ;
    Ensuite, identification des "éteints" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    proc sort data = test ; by ID descending annee ; run ;
    data test ; 
        set test ;
        by ID descending annee ;  
        retain TP_ETEINT ;
        if first.ID then TP_ETEINT = 1 ;
        if not missing (valeur) then TP_ETEINT = 0 ;
    run ;
    Enfin, définition du tag à partir des deux booléens précédemment construits (mais ça pourrait être géré dans l'étape data précédente)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data test ;
        set test ;
        TAG = not ( TP_NON_DEMARRE or TP_ETEINT) ; 
    run ;
    Base de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    data test ;
    input Annee ID valeur ;
    cards  ;
    1998 1 .
    1999 1 .
    2000 1 2
    2001 1 3
    2002 1 4
    2003 1 5
    2004 1 .
    1998 2 1
    1999 2 .
    2000 2 2
    2001 2 .
    2002 2 4
    2003 2 5
    2004 2 .
    ; run ;
    Résultat en sortie (après tri) :
    Obs Annee ID valeur TAG

    1 1998 1 . 0
    2 1999 1 . 0
    3 2000 1 2 1
    4 2001 1 3 1
    5 2002 1 4 1
    6 2003 1 5 1
    7 2004 1 . 0
    8 1998 2 1 1
    9 1999 2 . 1
    10 2000 2 2 1
    11 2001 2 . 1
    12 2002 2 4 1
    13 2003 2 5 1
    14 2004 2 . 0

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Par défaut
    Merci beaucoup Rémi pour cette réponse.

    ça marche très bien sur la table de test.

    Le seul truc un peu chiant c'est le double tri de la table (ça va être super long avec le nombre d'observations que je traine).

    Sinon Ok pour intégrer la somme dans l'avant dernière étape data.

    Merci beaucoup! je marque en résolu.

  4. #4
    Membre émérite
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Par défaut
    Tu peux gagner une étape de tri si ta table est déjà triée en entrée (c'est le cas dans l'exemple donné)

  5. #5
    Membre émérite
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose une autre solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    data test ;
    input Annee ID valeur ;
    cards  ;
    1998 1 .
    1999 1 .
    2000 1 1
    2001 1 .
    2002 1 4
    2003 1 .
    2004 1 .
    1998 2 1
    1999 2 .
    2000 2 .
    2001 2 .
    2002 2 3
    2003 2 .
    2004 2 .
    ; run ; 
    proc sort data=test ; by  id ; run;
    proc expand data = test out =test method=step;
      convert valeur = valeur1;
     by id;
    run;
     
    data test(drop=time valeur1);
    set test;
    if valeur1 ne . then tag=1;
    if valeur1=. then tag=0;
    run;
    Cordialement

  6. #6
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 7
    Par défaut
    Bonjour Rémi, Bonjour Brahim

    Rémi : C'est Ok pour le premier tri qu'on peut économiser et merci.

    Brahim: Merci pour cette nouvelle solution !

    Je voudrais savoir pourquoi tu as utilisé la method=STEP ? C'était juste pour donner un exemple ou y a t il une autre raison ?
    Car je vois qu'elle réplique la dernière observation connue et ça me gène un peu.
    J'ai tendance à préféré la methode=JOIN mais je ne comprend pas parfaitement la doc donc je ne sais pas s'il y a une contrainte qui m’empêcherais de le faire et que je ne saisis pas.

    Merci pour ton aide en tous cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/05/2007, 14h26
  2. [DAO]Parcourir une table Access en VB / Pb niveau débutant
    Par EtienneG dans le forum VBA Access
    Réponses: 10
    Dernier message: 25/04/2007, 05h35
  3. Parcourir une table
    Par fgrandjean dans le forum Administration
    Réponses: 1
    Dernier message: 04/10/2006, 12h41
  4. [SQL Server] parcourir une Table avec un FOR
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2006, 11h49
  5. Réponses: 6
    Dernier message: 28/12/2004, 16h09

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