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 :

Automatisation d'un code


Sujet :

SAS Base

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut Automatisation d'un code
    Bonjour,

    Je dispose de la table suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DATA test;
    INPUT 	Nom $
    	A_janv A_fevr A_mars A_avri
    	B_janv B_fevr B_mars B_avri
    	C_janv C_fevr C_mars C_avri
    	D_janv D_fevr D_mars D_avri
    	Age Ville $;
    CARDS;
    Pierre 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 28 2 Paris
    Josette 31 32 33 34 35 36 37 38 41 42 43 44 45 46 47 48 3 Toulon
    Gabriel 51 52 53 54 55 56 57 58 61 62 63 64 65 66 67 68 1 Brest
    Henri 71 72 73 74 75 76 77 78 81 82 83 84 85 86 87 88 5 Bordeaux
    ;
    RUN;
    Le code ci-dessous permet de regrouper dans une seule colonne les 4 valeurs (janvier, février, mars, avril) d'une même variable :
    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
    DATA test1(DROP = A_: B_: C_: D_: i Calendrier);
    SET test;
    ARRAY a {*} A_:;
    ARRAY b {*} B_:;
    ARRAY c {*} C_:;
    ARRAY d {*} D_:;
    	Calendrier = 'Janvier Février Mars Avril';
    	DO i=1 TO dim(a);
    		Mois = scan(Calendrier,i,' ');
    		Var_A = a(i);
    		Var_B = b(i);
    		Var_C = c(i);
    		Var_D = d(i);
    		OUTPUT;
    	END;
    RUN;
    Mon problème est que j'ai beaucoup de variables pour lesquelles je dispose des valeurs de janvier, février, mars, avril.
    Je cherche donc à automatiser le code.
    Je pensais à créer une boucle avec un seul array qui ne traite qu'un groupe de 4 variables en même temps. Un truc dans le genre :

    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
    PROC CONTENTS DATA = test OUT = colonne NOPRINT;
    RUN;
     
    PROC SQL NOPRINT;
    SELECT name INTO :old_var separated BY ' ' FROM colonne WHERE substr(name, INDEX(name, '_'));
    SELECT substr(name, INDEX(name, '_')+1) INTO :calendrier separated BY ' ' FROM colonne WHERE substr(name, INDEX(name, '_'));
    SELECT substr(name, 1, INDEX(name, '_')-1) INTO :new_var separated BY ' ' FROM colonne WHERE substr(name, INDEX(name, '_'));
    SELECT count (*) INTO :nbr FROM colonne WHERE substr(name, INDEX(name, '_'));
    QUIT;
     
    %MACRO TEST;
    DATA test1;
    SET test;
    ARRAY x {&nbr.} &old_var:;
    	%DO i=1 %TO &nbr.;
    		x(i) = &&new_var&i
    		Mois(i) = %scan("&calendrier",&i,' ');
    		OUTPUT;
    	%END;
    RUN;
    %MEND TEST;
    %TEST;
    Ce code ne fonctionne pas et ne traduit d'ailleurs pas franchement ce que je
    cherche à faire mais je m'emmêle un peu les pinceaux !

    Help !?

  2. #2
    Membre Expert
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Par défaut
    Bonjour

    une idée avec la proc transpose, attention il y a séparation des données individus (age, nom etc..) au préalable des données "mois" (A_janv, A_fevr, etc...)
    L'avantage c'est que tu n'as pas a connaitre exactement le nombre de variables tu type A_janv, B_janv, C_janv, D_janv, E_janv etc...
    A la condition que leur prefixe n'entre pas en "collision" avec les clefs (_janv,_fevr,_mars,_avri).


    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 donnees;length id $6.; set test; keep nom age ville id;id=strip(_n_);run;
     
    proc transpose data=test(drop=nom age ville) out=test2;
    run;
     
    data test2; set test2;
    mois=(index(_name_,'_janv')^=0)*1+(index(_name_,'_fevr')^=0)*2+(index(_name_,'_mars')^=0)*3+(index(_name_,'_avri')^=0)*4;
    _name_=tranwrd(_name_,'_janv','');
    _name_=tranwrd(_name_,'_fevr','');
    _name_=tranwrd(_name_,'_mars','');
    _name_=tranwrd(_name_,'_avri','');
    run;
    proc sort data=test2;  by mois;run;
    proc transpose data=test2 out=test3;
    by mois;run;
    proc sort data=test3; by _name_;run;
     
    data test3;set test3;
    _name_=strip(tranwrd(_name_,'COL',''));
    if mois=1 then month='janv';
    if mois=2 then month='fevr';
    if mois=3 then month='mars';
    if mois=4 then month='avri';
    drop mois;
    rename _name_=id;
    run;
    data test4; merge test3 donnees; by id;drop id;run;
    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
     
                                 Obs     A     B     C     D    month      Nom      Age    Ville
     
                                   1    11    15    21    25    janv     Pierre      2     Paris
                                   2    12    16    22    26    fevr     Pierre      2     Paris
                                   3    13    17    23    27    mars     Pierre      2     Paris
                                   4    14    18    24    28    avri     Pierre      2     Paris
                                   5    31    35    41    45    janv     Josette     3     Toulon
                                   6    32    36    42    46    fevr     Josette     3     Toulon
                                   7    33    37    43    47    mars     Josette     3     Toulon
                                   8    34    38    44    48    avri     Josette     3     Toulon
                                   9    51    55    61    65    janv     Gabriel     1     Brest
                                  10    52    56    62    66    fevr     Gabriel     1     Brest
                                  11    53    57    63    67    mars     Gabriel     1     Brest
                                  12    54    58    64    68    avri     Gabriel     1     Brest
                                  13    71    75    81    85    janv     Henri       5     Bordeaux
                                  14    72    76    82    86    fevr     Henri       5     Bordeaux
                                  15    73    77    83    87    mars     Henri       5     Bordeaux
                                  16    74    78    84    88    avri     Henri       5     Bordeaux
    enfin il me semble que c'était le résultat que tu attendais.

    Par contre je ne sais pas si le code va s'adapter à la volumétrie de tes données du fait du basculement des individus en variables par la proc transpose...

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut
    Si si, c'est bien ce que j'attendais.
    Merci !

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

Discussions similaires

  1. Automatisation / contrôle de code
    Par titanblanc dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 28/04/2011, 15h27
  2. Automatiser le "Code Metrics"
    Par Bluedeep dans le forum Visual Studio Team System
    Réponses: 2
    Dernier message: 03/06/2009, 17h53
  3. Automatisation avec sqlcmd sans code erreur
    Par areivilo dans le forum Administration
    Réponses: 6
    Dernier message: 17/02/2009, 20h43
  4. Automatisation de mesure, code non fini
    Par sennju dans le forum C
    Réponses: 1
    Dernier message: 24/01/2008, 22h06
  5. automatiser code postal et ville
    Par bolderiz35 dans le forum Access
    Réponses: 2
    Dernier message: 22/09/2006, 12h22

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