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 :

Valeurs d'une colonne en variable


Sujet :

SAS Base

  1. #1
    Candidat au Club
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Valeurs d'une colonne en variable
    Bonjour,

    Je suis nouveau sur le forum mais je le consulte très souvent et je trouve toujours ce que je recherche sauf cette fois.
    En effet, j'ai besoin d'utiliser le logiciel SAS au boulot ce qui n'est pas nouveau pour moi mais je n'ai jamais eu besoin de beaucoup créer de programme donc j'ai un petit problème peut être tout bête mais je ne sais pas faire référence à une ligne inférieur à celle de la ligne de référence dans une même colonne.

    Je vais illustrer ce n'est sans doute pas clair du tout :

    Table resume

    Identifiant pays date métier
    123 Fr 2016 Vendeur
    123 Ru 2015 Vendeur
    246 Fr 2016 Manager

    En fait, si pour un même identifiant, le métier est vendeur alors je souhaite remplacer Ru par Fr.
    En gros, si une personne est vendeur (uniquement), je veux qu'il soit considéré comme étant employé dans le même pays sur toute les périodes et que ce pays soit le plus récent.

    J'ai trié ma table dans l'ordre croissant des identifiants et décroissant des dates avec un proc sort et puis gros bug je ne sais pas dire à SAS de comparer deux lignes et de corriger des valeurs selon mes conditions. Je crois que je dois créer des macro variables et mettre les valeurs des colonnes identifiants, pays, date et métier en variable mais je n'ai jamais utilisé de macro variable surtout que j'ai des milliers de lignes.

    Par avance merci même si on ne trouve pas de solution au moins j'apprendrai des choses.

  2. #2
    Membre actif
    Femme Profil pro
    Analyste en Intelligence d'Affaires (BI)
    Inscrit en
    Avril 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste en Intelligence d'Affaires (BI)
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 245
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Voici une 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
     
     
    DATA resume;
    	input Identifiant pays $ date metier $;
    	cards;
    123 Fr 2016 Vendeur
    123 Ru 2015 Vendeur
    246 Fr 2016 Manager
    ;
    Run;
     
    proc sql;
    create table res_recent as select
    distinct
    identifiant,
    max(date) as date_recent,
    pays as pays_recent
    from resume
    group by identifiant
    having date=calculated date_recent
    ;
    quit;
     
    data resultat (drop=date_recent pays_recent);
    merge resume res_recent;
    by identifiant;
    if metier="Vendeur" then pays=pays_recent;
    run;
    Il y a probablement moyen de le faire en une seule étape en jouant avec des retain et lag mais je connais moins cette mécanique.

  3. #3
    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,
    Avec la fonction RETAIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    proc sort data=resume ; by Identifiant descending date ; run ;
     
    data Finale (drop=pays_recent); 
      set resume ;	  
      by Identifiant ; 
      retain pays_recent ;
      if first.Identifiant and metier='Vendeur' then pays_recent=pays ; 
      pays=pays_recent ; 
    run ;
    Cordialement Ward

  4. #4
    Candidat au Club
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Octobre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Résolu
    Bonjour,

    Merci pour vos réponses elles m'ont bien aidé.
    La solution est venue du retain mais en passant bien par une nouvelle variable comme avec l'exemple pays_recent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Data matable;
    Set matable;
    Retain pays recent;
    If identifiant=lag(identifiant) and metier="vendeur" and metier=lag(metier) then do pays_recent=pays_recent;
    End;
    Else do;
    Pays_recent=pays;
    End;
    Run;
    De memoire j'ai fait ça et ça a fonctionné donc un melange de vos idees de retain et lag.
    Peut etre le code est simplifiable mais il fonctionne. Un grand merci.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/01/2022, 11h24
  2. [AC-2003] Concaténer les valeurs d'une colonne dans une variable
    Par Kiwix dans le forum VBA Access
    Réponses: 1
    Dernier message: 06/04/2011, 10h20
  3. récupérer les valeurs d'une colonne dans une variable
    Par free_dom dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/02/2011, 13h14
  4. [VBA-E]Recherche d'une valeur avec la colonne comme variable
    Par Corlo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/04/2007, 09h21
  5. intervertir les valeurs dans une colonne d'une table
    Par hammou dans le forum Débuter
    Réponses: 2
    Dernier message: 26/01/2004, 10h15

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