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 :

Remplissage de ligne sous SAS


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut Remplissage de ligne sous SAS
    Bonjour TLM,

    J'ai un petit souci sous SAS:

    J'ai une base dans laquelle j'ai 2 colonnes à savoir: Num_contrat et activité. La colonne Num_contrat est remplie à 100% or la colonne activité pas complètement. J'ai ce cas de figure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data test;
    input num_ctr activ$;
    cards;
     
    11111 AC224
    11111  
    12351 AC226
    12361 
    ;run;
    J'aimerais dire à sas que si mon numéros de contrat est déboulé mais la colonne activité n'est pas renseignée dans une des lignes, ils me prennent l'activité de ce contrat renseigné. Si par contre j'ai une ligne n_mcontrat non dédoublée et que l'activité n'est pas renseignée, dans ce cas il me laisse la colonne vide.

    Dans mon exemple précédent j'aurais donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1111 AC224
    1111 AC224
    12351 AC226
    12361
    Merci beaucoup

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Une solution possible :

    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
    data tt;
     infile cards missover;
     input num_ctr activ $;
     cards;
     11111 AC224
     11111 
     12351 AC226
     12361 
     12362
     12362 AC352  
     ;run;
     
     Data ttt (drop = rc);
     If _n_ = 1 then do;	
    	IF 0 then set tt;
    	DCL HASH my_hash (dataset: 'tt(where=(missing(activ)=0))');
    	my_hash.definekey ('num_ctr');
    	my_hash.definedata ('activ');
    	my_hash.definedone();
    End;
     Set tt;
     If missing(activ) then do;
    	 rc = my_hash.find(); 
     End;
    Run;
    Flo00154

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut
    Merci Flo ça fonctionne, par contre je ne comprends pas le code. Peux-tu m'expliquer les fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DCL HASH my_hash (dataset: 'tt(where=(missing(activ)=0))');
    	my_hash.definekey ('num_ctr');
    	my_hash.definedata ('activ');
    	my_hash.definedone();

    Merci

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    DCL HASH my_hash (dataset: 'tt(where=(missing(activ)=0))');
    Tu déclares une table de hashing qui sera stockée en mémoire (tu as plein de doc sur le sujet si tu veux en savoir plus). Je conserve que les lignes avec "Activ" non manquant


    my_hash.definekey ('num_ctr');
    Définition de la variable qui servira de clé de recherche (c'est le même principe qu'un rechercheV sous Excel)

    my_hash.definedata ('activ');
    Définition des variables qui seront à retourner

    my_hash.definedone();
    Fin de la définition de la table de hashing

    rc = my_hash.find();
    La fonction find demande de rechercher la valeur du numéro de contrat dans la table de hashing et de renvoyer la valeur de la variable activ s'il y a match


    Flo00154

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Points : 27
    Points
    27
    Par défaut
    Je ne connaissais pas du tout merci Flo.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Une 2 ème proposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Data Resultat (drop = Temp);
      Do  Until ( Last.num_ctr ) ;
        Set TaTable ;
        By num_ctr ;
    	if not missing (activ) then Temp=Activ ;
      End ;		
      Do Until ( Last.num_ctr ) ;
        Set TaTable ;
        By num_ctr ;
    	Activ=Temp ;
        output ;
      End ;
    Run ;
    Ward

  7. #7
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Je crois que cette solution est plus simple.
    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 tt;
     infile cards missover;
     input num_ctr activ $;
     cards;
     11111 AC224
     11111 
     12351 AC226
     12361 
     12362
     12362 AC352  
     12363 AC352 
     ;run;
    proc sort data=tt;
    by num_ctr descending activ; run;
    data tt1; set tt;
    by num_ctr;
    if first.num_ctr then output; run;

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    Décembre 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 198
    Points : 638
    Points
    638
    Par défaut
    Je crois que cette solution est plus simple.
    En effet, mais tu supprimes les lignes pour lesquelles le code est renseigné une fois et valeur manquante sur les autres, or il souhaite combler les trous et non pas supprimer les lignes.

    Flo00154

  9. #9
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Citation Envoyé par flo00154 Voir le message
    En effet, mais tu supprimes les lignes pour lesquelles le code est renseigné une fois et valeur manquante sur les autres, or il souhaite combler les trous et non pas supprimer les lignes.

    Flo00154
    Tu as raison, j'ai lu rapidement la demande...
    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
     
     
    data tt;
     infile cards missover;
     input num_ctr activ $;
     cards;
     11111 AC224
     11111 
     12351 AC226
     12361 
     12362
     12362 AC352  
     12363 
     12364 AC351 
     ;run;
    proc sort data=tt;
    by num_ctr descending activ; run;
    data tt1 (drop=temp); set tt;
    by num_ctr;
    retain temp;
    if first.num_ctr then temp=activ;
    activ=temp;
    run;

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/03/2016, 19h03
  2. [XL-2010] Remplissage de lignes sous condition
    Par jay5457 dans le forum Excel
    Réponses: 7
    Dernier message: 23/04/2015, 08h58
  3. Extraction de lignes sous sas
    Par sakhob dans le forum SAS Base
    Réponses: 2
    Dernier message: 10/12/2012, 17h12
  4. Réponses: 4
    Dernier message: 26/06/2012, 11h34

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