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 de ligne suivant une condition


Sujet :

SAS Base

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Création de ligne suivant une condition
    Bonjour à tous,

    Je me permet de poster ce problème sur le forum, car j'ai un peu de mal à trouver la solution à mon problème.
    J'aimerais ajouter à une table une ligne avec les mêmes valeurs que la précédente lorsqu'il manque une ligne (à ma variable x)
    Ce n'est pas facile à expliquer par écrit, voici donc un exemple précis de ce que j'aimerais obtenir.

    j'ai une table SAS de ce type:
    x var1 var2 var3
    1 50 40 55
    2 30 25 2
    3 1 9 99
    6 2 5 6
    7 15 19 11
    9 12 23 25
    10 25 59 91

    Et j'aimerais obtenir la table suivante:
    x var1 var2 var3
    1 50 40 55
    2 30 25 2
    3 1 9 99
    4 1 9 99
    5 1 9 99
    6 2 5 6
    7 15 19 11
    8 15 19 11
    9 12 23 25
    10 25 59 91


    Merci d'avance

  2. #2
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Remplacer des données manquantes par les valeurs précédentes
    Bonjour,

    Une proposition en utilisant 2 instructions set dans une étape data (source) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data table1;
      input x var1 var2 var3;
      cards;
    1 50 40 55
    2 30 25 2
    3 1 9 99
    6 2 5 6
    7 15 19 11
    9 12 23 25
    10 25 59 91
    ;
    run;
    1) Créer les lignes vides :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    data table2;
      do x=1 to 10;
        output;
      end;
    run;
     
    data table1;
      merge table1 table2;
      by x;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                                           x    var1    var2    var3
     
                                           1     50      40      55
                                           2     30      25       2
                                           3      1       9      99
                                           4      .       .       .
                                           5      .       .       .
                                           6      2       5       6
                                           7     15      19      11
                                           8      .       .       .
                                           9     12      23      25
                                          10     25      59      91
    2) Remplacer les données manquantes par les valeurs précédentes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    data table3;
      set table1;
      n=_n_;
      if missing(var1) then do;
         do until (not missing(var1));
           n=n-1;
           set table1(keep=var1 var2 var3) point=n;
         end;
      end;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                                           x    var1    var2    var3
     
                                           1     50      40      55
                                           2     30      25       2
                                           3      1       9      99
                                           4      1       9      99
                                           5      1       9      99
                                           6      2       5       6
                                           7     15      19      11
                                           8     15      19      11
                                           9     12      23      25
                                          10     25      59      91
    Cordialement,

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    je viens de l'adapter à mes données cela fonctionne parfaitement, merci beaucoup.
    Bonne journée

  4. #4
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Remplacer des données manquantes par les valeurs précédentes
    Bonjour,

    Suite à une autre discussion, une proposition avec l'instruction retain pour la deuxième étape :

    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
    data table4;
      set table1;
      retain new_var1 new_var2 new_var3;
      if not(missing(var1)) then do;
        new_var1=var1;
        new_var2=var2;
        new_var3=var3;
      end;
      else do;
        var1=new_var1;
        var2=new_var2;
        var3=new_var3;
      end;
      drop new_var1 new_var2 new_var3;   
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                                           x    var1    var2    var3
     
                                           1     50      40      55
                                           2     30      25       2
                                           3      1       9      99
                                           4      1       9      99
                                           5      1       9      99
                                           6      2       5       6
                                           7     15      19      11
                                           8     15      19      11
                                           9     12      23      25
                                          10     25      59      91
    Cordialement,

  5. #5
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Création de ligne suivant une condition
    • avec la méthode proposée par hossward ici :

    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
    data table1;
      input x var1 var2 var3;
      cards;
    1 50 40 55
    2 30 25 2
    3 1 9 99
    6 2 5 6
    7 15 19 11
    9 12 23 25
    10 25 59 91
    ;
    run;
     
    data table2;
      merge table1 table1(keep=x rename=(x=_x) firstobs=2) end=last;
      output;
     
      if not(last) then do;
        Temp=x;
        do i=1 to _x-x-1  ;
          x=Temp+i; 
          output ;
        end;
      end;
     
      drop i Temp _: ;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                                        x    var1    var2    var3
     
                                        1     50      40      55
                                        2     30      25       2
                                        3      1       9      99
                                        4      1       9      99
                                        5      1       9      99
                                        6      2       5       6
                                        7     15      19      11
                                        8     15      19      11
                                        9     12      23      25
                                       10     25      59      91

    • par groupe :

    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
    data table1;
      input id x var1 var2 var3;
      cards;
    1 1 50 40 55
    1 2 30 25 2
    1 3 1 9 99
    1 6 2 5 6
    1 7 15 19 11
    1 9 12 23 25
    1 10 25 59 91
    ;
    run;
     
    data table2;
      merge table1 table1(keep=id x rename=(id=_id x=_x) firstobs=2) ;
      output;
     
      if id=_id then do;
        Temp=x;
        do i=1 to _x-x-1  ;
          x=Temp+i; 
          output ;
        end;
      end;
     
      drop i Temp _: ;
    run;

    • ou encore :

    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 table1;
      input id x var1 var2 var3;
      cards;
    1 1 50 40 55
    1 2 30 25 2
    1 3 1 9 99
    1 6 2 5 6
    1 7 15 19 11
    1 9 12 23 25
    1 10 25 59 91
    ;
    run;
     
    data table2;
      merge table1 table1(keep=x rename=(x=_x) firstobs=2) ;
    run;
     
    data table2;
      set table2;
      output;
      by id;
      if not(last.id) then do;
        Temp=x;
        do i=1 to _x-x-1  ;
          x=Temp+i; 
          output ;
        end;
      end;
     
      drop i Temp _: ;
    run;
    Cordialement,

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

Discussions similaires

  1. [PHP 5.0] colorer les lignes d'un tableau suivant une condition
    Par Natoucka dans le forum Langage
    Réponses: 10
    Dernier message: 14/04/2016, 21h10
  2. Incrémenter une ligne suivant une condition
    Par lovecraft dans le forum IHM
    Réponses: 1
    Dernier message: 24/02/2012, 09h14
  3. Ordonner suivant une condition des groupes de lignes
    Par lookmehard dans le forum SQL
    Réponses: 13
    Dernier message: 18/07/2011, 09h31
  4. Réponses: 8
    Dernier message: 20/06/2005, 15h10
  5. Réponses: 5
    Dernier message: 29/09/2004, 11h05

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