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 :

Lag et/ou retain le retour


Sujet :

SAS Base

  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut Lag et/ou retain le retour
    Bonjour,

    J'aimerais pouvoir récupérer, pour un couple {date/echelle x}, dans le cas où ma variable duree est vide, la valeur de la variable durée du couple {date précédente/echelle x}.

    J'ai fait des tentatives avec la fonction lag ou encore du retain, mais pour le moment je n'ai pas trouvé la solution.

    La discussion suivante était prometteuse mais je n'ai pas réussi à l'adapter à mon cas :
    [URL="http://www.developpez.net/forums/d1380496/logiciels/solutions-d-entreprise/business-intelligence/sas/sas-base/fonction-lag-sas/"]

    Voici un extrait des données avec dans duree mes données initiales et dans duree_esperee ce que je n'ai pas et que je cherche à obtenir in fine :
    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
    data truc;
    input datea echelle $ sal duree duree_esperee;
    format datea ddmmyy10.;
    cards;
    15000 1 150 8 8
    15000 2 151 8 8
    15000 3 152 10 10
    15000 E 154 . .
    15012 1 200 . 8
    15012 2 201 . 8
    15012 3 202 . 10
    15012 E 204 . .
    15040 1 251 13 13
    15040 2 252 11 11
    15040 3 253 9 9
    15040 E 255 . .
    15100 1 301 . 13
    15100 2 302 . 11
    15100 3 303 . 9
    15100 E 305 . .
    15110 1 310 15 15
    15110 2 311 15 15
    15110 3 312 15 15
    15110 E 314 . .
    ;
    run;
    Voici où j'en suis (mais ni la version sans commentaire => qui me renvoie bien des valeurs pour les lignes qu'il faut, mais à chaque fois la seule première valeur à cause du "first.") ni la version commentée (qui me renvoie les bonnes valeurs mais pas aux bonnes lignes car juste décalées par un "bête" lag) ne fonctionnent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data truc2;
    set truc;
    by datea echelle;
    retain duree_modelisee 0;
    /*if first.datea and first.echelle  
    then */duree_modelisee = lag(duree);
    run;
    Je précise que je ne peux pas utiliser un lagx() car le x est différent d'un groupe d'observations à l'autre.

    D'avance merci pour toutes les idées proposées !

  2. #2
    Membre éprouvé
    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
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    data truc;
    input datea echelle $ sal duree duree_esperee;
    format datea ddmmyy10.;
    cards;
    15000 1 150 8 8
    15000 2 151 8 8
    15000 3 152 10 10
    15000 E 154 . .
    15012 1 200 . 8
    15012 2 201 . 8
    15012 3 202 . 10
    15012 E 204 . .
    15040 1 251 13 13
    15040 2 252 11 11
    15040 3 253 9 9
    15040 E 255 . .
    15100 1 301 . 13
    15100 2 302 . 11
    15100 3 303 . 9
    15100 E 305 . .
    15110 1 310 16 14
    15110 2 311 . 15
    15110 3 312 1 .
    15110 E 314 . .
    ;
    run;
     
    data truc2 (rename =(duree1=duree duree_esperee1=duree_esperee));
    set truc;
    by datea ;
    retain duree1 duree_esperee1;
    if first.datea then do;
    duree1 =. ;
    duree_esperee1=.;
    end;
    if duree ne . and duree_esperee ne . then do;
    if duree ne . then duree1=duree;
    if duree_esperee ne . then duree_esperee1=duree_esperee;
    drop duree_esperee duree;
    end;
    run;
    Si tu as des questions n'hésiter pas

    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Bonjour,

    Tout d'abord merci pour ta réponse et pour t'être penché sur mon problème !
    Ceci dit, je pense que ma problématique n'était pas assez claire. En fait, je ne dispose pas de la variable "duree_esperee" dans mes données. Je l'ai juste mise dans ma table truc en exemple pour illustrer ce que je cherchais à obtenir à la fin du programme. J'aurais dû faire deux tables distinctes pour ne pas t'induire en erreur.

    Mais la nuit porte conseil et une fois n'est pas coutume, c'est à tête reposée que j'ai eu une idée qui semble marcher : en triant mes données selon la variable echelle puis datea et en effectuant le lag à partir de cette table triée (moyennant quelques ajustements pour éviter d'écraser une vraie durée ou en créer une à tort) cela semble fonctionner.

    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
    proc sort data=truc out=test_bis;
    by echelle datea;
    quit;
     
    data truc2_bis;
    set test_bis;
    by echelle datea;
    retain duree_modelisee 0;
    duree_modelisee=lag(duree);
     
    if first.echelle then duree_modelisee = .;
    if duree = . then duree_final = duree_modelisee;
    else duree_final = duree;
    run;
     
    proc sort data=truc2_bis out=truc3_bis;
    by datea echelle;
    quit;
    ===> Ca marche bien sur ce cas d'école, où on n'a bien une date avec la durée renseignée puis une date avec valeur manquante, etc... mais dès lors qu'on a deux dates de suite où on a des valeurs manquantes, ça ne fonctionne plus.

    On s'approche, on s'approche mais il manque encore un petit quelque chose :/

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    C'est un peu plus compliqué mais ça marche avec la nouvelle table où deux dates d'affilée ont des valeurs manquantes pour duree :

    La nouvelle table en entrée :
    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 truc;
    input datea echelle $ sal duree duree_esperee;
    format datea ddmmyy10.;
    cards;
    15000 1 150 8 8
    15000 2 151 8 8
    15000 3 152 10 10
    15000 E 154 . .
    15012 1 200 . 8
    15012 2 201 . 8
    15012 3 202 . 10
    15012 E 204 . .
    15022 1 200 . 8
    15022 2 201 . 8
    15022 3 202 . 10
    15022 E 204 . .
    15040 1 251 13 13
    15040 2 252 11 11
    15040 3 253 9 9
    15040 E 255 . .
    15100 1 301 . 13
    15100 2 302 . 11
    15100 3 303 . 9
    15100 E 305 . .
    15110 1 310 15 15
    15110 2 311 15 15
    15110 3 312 15 15
    15110 E 314 . .
    ;
    run;
    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
    proc sort data=truc out=test_bis;
    by echelle datea;
    quit;
     
    data truc2_bis;
    set test_bis;
    by echelle datea;
    retain duree_modelisee dur_test 0;
    dur_test = lag(duree);
    if lag(duree) ne . then duree_modelisee=dur_test/*lag(duree)*/;
    else duree_modelisee = sum(0,duree_modelisee);
     
    if first.echelle then duree_modelisee = .;
    if duree = . then duree_final = duree_modelisee;
    else duree_final = duree;
    run;
     
    proc sort data=truc2_bis out=truc3_bis;
    by datea echelle;
    quit;
     
    data truc4_bis;
    set truc3_bis;
    by datea echelle;
    if last.datea then duree_final=.;
    run;
    Cela oblige à faire pas mal d'étapes par contre...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/04/2016, 09h31
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. Lag ou de retain
    Par aucunexperience dans le forum Débutez
    Réponses: 4
    Dernier message: 24/04/2012, 11h33
  4. Réponses: 8
    Dernier message: 24/11/2011, 14h48
  5. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47

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