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

Macro Discussion :

Créer une macro qui permet de supprimer les colonnes présentant la meme modalité.


Sujet :

Macro

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Créer une macro qui permet de supprimer les colonnes présentant la meme modalité.
    Bonjour, je dois affectuer une macro qui permet de supprimer les colonnes présentant la meme modalité.
    Ex:
    V1 V2 V3 V4
    5 2 5 3
    5 2 6 3
    4 2 8 3
    6 2 7 3
    8 2 6 3
    Dans ce cas je vais devoir supprimer la 2eme colonne et la 4 eme colonne. Le nombre de variable n'est pas fixé.
    J'y réfléchi depuis un moment mais impossible de trouver la réponse , pouvez vous m'éclairer s'il vous plait ?

    Merci par avance.

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

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour,

    peut-être devrait tu définir un peu plus finement ta problématique.

    Dans ton exemple, je ne vois qu'une table avec une seule variable.
    Toi tu en vois 4. Je suppose donc que tu pars d'une définition de variable : 1 variable = 1 caractère.


    Partant de là je vois bien que la deuxième variable ne comporte que des 2 et la quatrième que des 3...

    Mais pour moi ça n'en fait pas des variables à modalités égales... L'une a pour unique modalité 2, et l'autre 3, et 2^=3...

    Quelle est ta définition de variables "présentant la même modalité" sur laquelle nous devons partir ...?

  3. #3
    Membre actif
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juillet 2013
    Messages : 37
    Points : 206
    Points
    206
    Par défaut
    Bonjour,
    je n'ai pas très bien compris votre problématique mais si chaque caractère concerne une variable j'ai fait un programme qui répond à la question (bien sur si chaque colonne des nombre que vous avez donnés concerne une colonne)
    Ci-contre le code:
    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
    46
    47
    48
     
    data test;
    input x y z t;
    cards;
    5 2 5 3
    5 2 6 3
    4 2 8 3
    6 2 7 3
    8 2 6 3
    ;
    run;
     
    proc transpose data=test name=les_var out=test2; 
    run;
     
    proc contents data=test2 out=contenu(keep=name varnum where=(name ne 'les_var')) noprint;
    run;
    proc sort data =contenu ;
    by varnum;
    run;
     
    proc sql noprint;
      select name into :lst_var separated by ' ' from contenu;
    run;
    %put &lst_var.;
     
      %macro liste_var;
        %global filtre;
        %let i=1;
          %let filtre=%scan (&lst_var.,&i.)%str(=)%scan (&lst_var.,&i.+1);
        %do i=2 %to %eval(%sysfunc(countw(&lst_var.))-1);
          %let filtre =&filtre. and %scan(&lst_var.,&i.)%str(=)%scan(&lst_var.,&i.+1);
        %end;
       %mend;
    %liste_var;
    proc print data=test2;
    run;
     
    data test3;
      set test2;
      if  &filtre then delete;
    run;
     
    proc transpose data=test3 out=test4(drop=_name_);
    id les_var;
    run;
    proc print data=test4;
    run;
    Cordialement

  4. #4
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Une autre solution est également 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
     
    DATA test;
    input col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15;
    cards;
    1 10 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 10 1 1 2 2 2 2 2 2 2 2 2 2 2
    1 10 1 1 3 3 3 3 3 3 3 3 3 3 3
    1 10 1 1 4 4 4 4 4 4 4 4 4 4 4
    1 10 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 10 1 1 2 2 2 2 2 2 2 2 2 2 2
    1 10 1 1 3 3 3 3 3 3 3 3 3 3 3
    ; run ;
     
     
    %macro test();
    %global variable;
    %let variable= ;
    proc contents data=test out=contenu(keep=name ) noprint;
    run;
     
    data _null_;
    set contenu;
    call symputx('var'||left(_n_),compress(name));
    call symput('cnt',compress(_n_));
    run;
     
    %do i=1 %to &cnt;
     
    proc sort data=test nodupkey out=test_nodup; 
    by &&var&i ;
    run;
     
     
    DATA _null_;
    SET test_nodup END=eof; 
    IF eof THEN DO;
          CALL SYMPUT('nb',put(_N_,8.)); 
    END;
    run;
     %if &nb =1 %then %do;
    %let variable=%sysfunc(catx(%str( ),&variable,&&var&i));
    %put &variable;
    %end;
    %end;
    %mend;
    %test;
     
    data test (drop=&variable );
    set test;
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  5. #5
    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,
    Je pense qu’on n’a pas besoin d’une macro. Il suffit d'utiliser l’option « NLEVELS » de la proc freq comme ceci :
    http://www.developpez.net/forums/d14...bles-modalite/
    Cdt Ward

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Le but de mon exercice est d'enlever toutes variables ayant la meme modalité sachant que le nombre de variable n'est pas déterminer.
    donc ici le programme devra enlever la deuxieme et quatrième colonne .

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre aide ! le programme fonctionne très bien !
    Mais j'ai quelques questions a propos des fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DATA _null_;
    SET test_nodup END=eof; 
    IF eof THEN DO;
          CALL SYMPUT('nb',put(_N_,8.)); 
    END;
    A quoi correspond EOF ?
    et put(_N_,8.) ?
     
    Que signifie cette ligne ?
    %let variable=%sysfunc(catx(%str( ),&variable,&&var&i));
    Merci par avance,
    cordialement.

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour votre aide josef1980!

  9. #9
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,


    Voici les étapes de résolution du sujet avec les réponses à tes questions:

    1/ Déterminer les variables présentes dans la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     proc contents data=test out=contenu(keep=name ) noprint;
    run;

    2/ création des macro variables liées à chaque variable ainsi le nombre des ces variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    data _null_;
    set contenu;
    call symputx('var'||left(_n_),compress(name));
    call symput('cnt',compress(_n_));
    run;



    3/ pour chaque macro variable créée, j'applique une proc sort avec l'option nodupkey afin de déterminer les modalités liées à chaque variable.

    la table test_nodup me sert de sortie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    proc sort data=test nodupkey out=test_nodup; 
    by &&var&i ;
    run;


    3/ Suite aux nombre d’observations obtenu dans la test_nodup, je regarde le nombre observations.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DATA _null_;
    SET test_nodup END=eof; 
    IF eof THEN DO;
          CALL SYMPUT('nb',put(_N_,8.)); 
    END;
    run;
    3.1/ Pour EOF: End of File.
    Par habitude, on donne ici le nom EOF (End Of File) comme nom à la variable lorsque l'option END= est utilisée.
    Prend une valeur 1 s’il s’agit de la dernière observation, 0 autrement.
    Comme la variable automatique _N_, EOF n’apparaît pas dans le data set final, s’il est créé
    (Ref: https://thesasreference.wordpress.com/tag/_n_/)

    3.2/ Afin d'éviter cette note dans la log:

    NOTE: Numeric values have been converted to character values at the places given by:
    (Line)Column).

    j'ai réalisé la conversion comme suit: CALL SYMPUT('nb',put(_N_,8.));

    Test:

    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 _null_;
    SET sashelp.class END=eof; 
    IF eof THEN DO;
          CALL SYMPUT('nb1',_N_); 
    END;
    run;
     
    DATA _null_;
    SET sashelp.class END=eof; 
    IF eof THEN DO;
          CALL SYMPUT('nb2',put(_N_,3.)); 
    END;
    run;
    4/ Ne garder que les variables pour lesquelles le nombre d'observation lors de la proc sort est égal à 1.

    Pour rappel: Les macros variables sont des caractères.

    pour le fonctionnement de la comparaison

    4.1) le compilateur macro passe : &nb est remplacé valeur trouvée.
    4.2) le compilateur SAS : interprète la valeur comme un nombre est la compare avec 1.


    5/ Récupération de l'ensembles des variables pour lesquelles le &nb=1
    /La macro variable : variable est initialisée au début du programme.

    Mise à jour de la macro variable une fois le test de comparaison est ok

    %let variable=%sysfunc(catx(%str( ),&variable,&&var&i));

    Chaque mise à jour est séparée d'un espace pour son utilisation lors du drop.

    6/ Suppression des variables trouvées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data test (drop=&variable );
    set test;
    run;

    Si tu as des questions n'hésiter pas

    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/07/2013, 10h23
  2. Réponses: 3
    Dernier message: 23/05/2012, 15h03
  3. une fonction qui permet de supprimer les espaces
    Par inayatallah dans le forum Débuter
    Réponses: 5
    Dernier message: 03/01/2010, 17h36
  4. Créer une macro qui reproduit vers le bas
    Par Jimy6000 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/01/2008, 10h43
  5. Réponses: 5
    Dernier message: 23/10/2007, 14h56

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