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 :

Supprimer des lignes en fonction des "modalités" d'une variable


Sujet :

SAS Base

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur/Statisticien
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur/Statisticien
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Supprimer des lignes en fonction des "modalités" d'une variable
    Bonjour, l'Intitulé de ce post n'est pas exact, voici le problème que je recontre.
    En fait, je voudrais supprimer les lignes d'une table lorsque ma variable qualitative forme une série inférieure ou égale à 30 et conserver les séries supérieures à 30.


    Exemple :
    Ma var 1 peut prendre les modalités a b c ou d.
    Var 1
    a
    a
    a
    a
    c
    b
    a
    a
    a
    a
    ...

    Si j'ai une série de 30 a (ou moins) à la suite je supprime ces lignes si non je les conserves. Après avori essayer LAG ou de réaliser des sommes comme ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DATA Essai1; SET Essai;
    retain som 0;
    IF Var1 = "a" then som+1;
    else som=0;
    IF som >29 and som <31 then indice=_N_;
    run;
    Je me retrouve bloqué ...

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Je n'ai que des idées compliquées pour gérer ton problème.
    Voici une solution en plusieurs étapes :
    1) créer un identifiant de séries continues de la même valeur. Ce sera un identifiant unique : dans ton jeu de données, 1 pour la 1e série de A, puis 2 pour C, puis 3 pour B, puis 4 pour la 2e série de A, etc.
    2) avec du SQL, calculer le nombre d'observations par série et filtrer uniquement les séries d'au moins x observations (filtre HAVING).
    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
    DATA work.test ; /* jeu d'essai */
    INPUT var1 $ ;
    DATALINES ;
    a
    a
    a
    a
    c
    b
    a
    a
    a
    a
    ;
    RUN ;
    DATA work.test2 ; /* identifiant de bloc */
      SET work.test ;
      BY var1 NOTSORTED ; /* ==> FIRST.VAR1 est vrai quand on démarre une nouvelle série */
      RETAIN idSerie 0 ;
      IF FIRST.var1 THEN idSerie=idSerie+1 ;
    RUN ;
    PROC SQL ;
      CREATE TABLE work.series AS
        SELECT *
    	FROM work.test2
    	GROUP BY idSerie
    	HAVING COUNT(*) > 3 /* COUNT(*) ==> nb de lignes */
      ;
    QUIT ;
    Bon courage.
    Olivier

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    solution alternative (ça reste un peu tordu...)

    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
     
    DATA work.test ; /* jeu d'essai */
    INPUT var1 $ ;
    DATALINES ;
    a
    a
    a
    a
    a
    a
    a
    a
    a
    c
    a
    a
    a
    b
    a
    a
    a
    a
    a
    a
    a
    ;
    RUN ;
     
    DATA work.test2(keep=var1 serie) work.test3 (keep=idserie serie);
      SET work.test ;
      BY var1 NOTSORTED ;
      IF FIRST.var1 THEN do ;
          idSerie=1 ;
    	  serie+1;
      end ;
      else idSerie+1;
      output test2;
      if last.var1 then output test3 ;
    RUN ;
     
    data test4 ;
    merge test2 test3;
    by serie;
    if idserie <=5 then delete;
    run;
    dans mon cas, si la série n'est pas au moins de longueur 5 alors, on ne la conserve pas.

    a+

    Sébastien Ringuedé

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur/Statisticien
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur/Statisticien
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup pour vos solutions, les deux méthodes fonctionnent parfaitement.

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

Discussions similaires

  1. [XL-2010] Macro insertion de nouvelles lignes en fonction des modalités
    Par Rageo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2014, 20h07
  2. [XL-2010] Supprimer des lignes en fonction de la valeur de la cellule de deux colonnes
    Par jérémyp8 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 18/07/2013, 09h25
  3. [XL-2010] supprimer des lignes en fonction de la valeur de la cellule d'une colonne
    Par psylo24 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2012, 13h09

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