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 :

Utilisation de retain [DATA]


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 33
    Points : 34
    Points
    34
    Par défaut Utilisation de retain
    Bonjour,
    je cherche à combler les vides d'un tableau de valeurs en utilisant retain.
    Ma tentative de programme comble le premier vide correctement, mais pas les autres, et donne la valeur S du retain à toutes les suivantes.

    Pour un age donné, je souhaite combler les valeurs anc manquantes et que la variable S prenne la valeur S précédente. (exemple pour age_01: anc=8 est manquant, je voudrai créer cette valeur avec un S=0.78)


    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    /*exemple de test*/
    Data entree;
    input age$ anc 2. S 6. ;
    cards;
     
    age_01 0 0.95
    age_01 1 0.9
    age_01 2 0.88
    age_01 3 0.86
    age_01 4 0.84
    age_01 5 0.82
    age_01 6 0.8
    age_01 7 0.78
    age_01 9 0.76
    age_01 10 0.74
    age_01 11 0.72
    age_01 12 0.7
    age_01 13 0.68
    age_01 14 0.66
    age_01 15 0.64
    age_01 17 0.62
    age_01 19 0.6
    age_01 22 0.56
    age_01 23 0.54
    age_01 25 0.52
    age_01 28 0.5
    age_01 30 0.48
    age_01 32 0.46
    age_01 35 0
    age_02 0 1
    age_02 1 0.93
    age_02 2 0.915
    age_02 4 0.885
    age_02 5 0.87
    age_02 6 0.855
    age_02 7 0.84
    age_02 8 0.825
    age_02 9 0.81
    age_02 10 0.795
    age_02 14 0.735
    age_02 15 0.72
    age_02 16 0.705
    age_02 17 0.69
    age_02 18 0.675
    age_02 19 0.66
    age_02 21 0.645
    age_02 24 0.63
    age_02 29 0.615
    age_02 33 0
    ;
    Voici mon programme qui ne donne pas le résultat espéré:

    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
     
    data sortie/*(keep= age anc S)*/;
    set entree;
    by age;
    retain anc_old S_old;
    if first.age then do;
    	anc_old=anc;
    	S_old=S;
    	output;
    end;
     
    else do;
    	if anc=anc_old+1 then do;
    			anc_old=anc;
    			S_old=S;
    		output;
    	end;
     
    else do;
    	inter=anc-anc_old;
    	do i=1 to inter-1;
    		anc=anc_old+1;
    		S=S_old;
    		output;
    		end;
    		anc_old=anc;
    		S_old=S;
    	end;
     
    end;
    run;
    Merci pour votre aide

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 33
    Points : 34
    Points
    34
    Par défaut correct?
    Bon je me réponds à moi même:

    ce code à l'air correct:

    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 sortie /*(keep= age anc S)*/;
    set entree;
    by age;
    retain anc_old S_old x y;
     
    if first.age then do;
    	anc_old=anc;
    	S_old=S;
    	output;
     
    	if last.age then output;
    end;
     
    else do;
     
    	if anc=anc_old+1 then do;
    			anc_old=anc;
    			S_old=S;
    			output;
    	end;
     
        else do;
     
    		x=anc;
    		y=S;
    		j=anc-anc_old;
     
    		do i=1 to j-1;
    		  anc=anc_old+i;
    		  S=S_old;
    		  output;
    		  end;
    		  anc=x;
    		  S=y;
    		  output;
    		 anc_old=anc;
    		 S_old=S;
    		 end;
     
    	end;
    run;

  3. #3
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 33
    Points : 34
    Points
    34
    Par défaut
    Merci s_a_m

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

Discussions similaires

  1. [DATA] Utilisation des instructions retain first et last
    Par AL212 dans le forum SAS Base
    Réponses: 10
    Dernier message: 12/02/2015, 16h16
  2. Utilisation de do while ou retain
    Par Olive2011 dans le forum SAS Base
    Réponses: 3
    Dernier message: 13/03/2013, 21h23
  3. Utilisation de retain
    Par labuche1138 dans le forum SAS Base
    Réponses: 2
    Dernier message: 26/07/2012, 13h47
  4. Réponses: 24
    Dernier message: 27/04/2011, 16h00

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