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 :

Macro pour calculer des profils lignes


Sujet :

Macro

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut Macro pour calculer des profils lignes
    bonjours,
    j'ai écris une petite procédure pour calculer des profils lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /*calcul des effectifs*/
    %macro effectif(tab,tabs,var1,var2);
    proc freq data=&tab ;
    table &var1*&var2;
    ODS output crosstabfreqs=&tabs (keep=&var1 &var2 Rowpercent);
    run;
    proc sort data=&tabs;
    by &var1;
    run;
    proc transpose data=&tabs out=&tabs (drop=_NAME_ _LABEL_);
    ID &var2;
    by &var1;
    run;
    %mend effectif;
    le problème avec ce code c'est qu'il ne prend pas les valeurs manquantes du coup je dois tjr renommer le nom de mes variables pour prendres ces dernières en compte
    Ma proc transpose quant à elle me met les observations en colonne
    le problème c'est qu'il peut y avoir des observations qu'on retrouve dans plusieurs autres variables.
    or si je fusionne de tables issue de cette macro les colonnes similaire vont s'ecraser .

    Voilà Merci d'avance .
    et ma proc transpose

  2. #2
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    Bonjour,

    Il existe une option dans la proc freq qui permet de traiter les valeurs manquantes comme une categorie a part entiere. Tu devrait la trouver sans trop de difficulte dans l'aide en ligne. Reviens vers nous si tu ne t'en sors pas.

    Bon courage,

    manoutz

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    il me semble que c'est l'instruction missing en tout cas j'ai déjà essayer et ça n'a rien donnée

  4. #4
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    Pas sur de comprendre la... Peux etre un peu plus clair? Quel est le soucis?

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    je voudrais savoir s'il y a une méthode plus simple que ma procédure ??

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    en fait je voudrais simplifier ma procédure car je ne la trouve pas optimale

    en effet je l'appel 8 fois

    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
    /*effectif par tranches d'âge pour chaque portefeuille*/
    %effectif(espace.base,espace.effectif_age,CODEPORTEFEUILLE,tranche_age);
     
    /*effectif par segment de rendez vous pour chaque portefeuille*/
    %effectif(espace.base,espace.effectif_rdv,CODEPORTEFEUILLE,SEGMENT_RDV);
     
    /*part des clients détenteurs de produit de prévoyance uniquement pour chaque portefeuille*/
    %effectif(espace.base,espace.effectif_monoprevoyance,CODEPORTEFEUILLE,top_mono_prev);
     
    /*part des nouveaux clients pour chaque portefeuille*/
    %effectif(espace.base,espace.EFFECTIF_nouveaux,CODEPORTEFEUILLE,New);
     
    /*répartition des clients selon leurs scores de fragilité pour chaques portefeuilles*/
    %effectif(espace.base,espace.EFFECTIF_fragilite,CODEPORTEFEUILLE,top_fragilite);
     
    /*part des clients joignables et des clients non joignables*/
    %effectif(espace.base,espace.EFFECTIF_joignabilite,CODEPORTEFEUILLE,TopTel1);
     
    /*part des clients mariés selon le regime matrimoniale*/
    %effectif(espace.base,espace.EFFECTIF_CUSB,CODEPORTEFEUILLE,CUSB);
     
    /*part des clients sous tutelle*/
    %effectif(espace.base,espace.EFFECTIF_curatut,CODEPORTEFEUILLE,curatut);
    je remarque d'autant plus que la base reste tjr la mm et que je pourrais ne faire qu'une seule table en sortie
    mais le probleme c'est que je ne vois pas comment faire d'autant plus qu'il serait plus aisée d'utiliser une macro variable qui reprend toutes les variables

  7. #7
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Tu pourrais partir d'une proc Tabulate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PROC TABULATE DATA=espace.base ;
      CLASS CODEPORTEFEUILLE
               tranche_age segment_rdv top_mono_prev new 
        / MISSING ;
      TABLE CODEPORTEFEUILLE,
               (tranche_age segment_rdv top_mono_prev new) *
               ROWPCTN / PRINTMISS ;
      ODS OUTPUT table = work.profils ;
    RUN ;
    Et puis ensuite un peu de manipulation de données selon la forme de ce que tu veux obtenir.

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    ah bon mais une proc tabulate ça n'est pas fait pour faire des tableaux hierarchique à la base??

  9. #9
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Je ne sais pas ce que c'est qu'un tableau "hiérarchique".
    La proc Tabulate construit des tableaux. Avec des stats dedans.

    La proc Freq peut aussi utiliser la notation avec des parenthèses (si ça se trouve, c'est la seule chose qui manque pour que ton code fonctionne, car je ne comprends pas bien le besoin) : tu peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TABLE var1 * (var2 var3 var4) ;
    Si nos réponses sont à côté de la plaque, essaye de construire un exemple avec les tables de la bibliothèque SASHELP (tout le monde les a) : CLASS, PRDSALE ou SHOES par exemple sont assez faciles à comprendre. Et indique-nous ce qui ne va pas actuellement dans le résultat obtenu.

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    non la proc tabulate est superbe et je viens de découvrir l'interet de cette procédure formidable ceci dit la difficulté est de récupérer une table en sortie qui soit "similaire" au tableau du rapport d'ou la proc transpose
    J'ai réadapter la proc transpose avec le code que tu ma donnés ca ne marche pas

    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
    PROC TABULATE DATA=espace.base ;
      CLASS CODEPORTEFEUILLE
                segment_rdv top_fragilite TopSpec 
        / MISSING ;
      TABLE CODEPORTEFEUILLE,
               (segment_rdv top_fragilite TopSpec) *
               ROWPCTN / PRINTMISS ;
      ODS OUTPUT TABLE = work.profils (keep=PctN_1000 CODEPORTEFEUILLE segment_rdv top_fragilite TopSpec) ;
    RUN;
    proc sort data=work.profils;
    by CODEPORTEFEUILLE;
    run; 
    proc transpose data=work.profils out=work.profils (drop=_NAME_ _LABEL_ rename=(couverture=couverture_Sum vacance=vacance_Sum));
    ID SEGMENT_RDV top_fragilite TopSpec;
    by CODEPORTEFEUILLE;
    VAR PctN_1000;
    run;
    ça ne marchera qu'avec une variable mise dans ID

  11. #11
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    bon j'ai fait ça c'est un peu moche mais bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %let varfreq=SEGMENT_RDV top_fragilite TopSpec;
    %let nvarfreq=%EVAL(%SYSFUNC(count(%cmpres(&varfreq.),%STR( )))+1);
    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
    /*calcul des frequences*/
    %macro calculfreq;
    PROC TABULATE DATA=espace.base ;
      CLASS CODEPORTEFEUILLE
                &varfreq 
        / MISSING ;
      TABLE CODEPORTEFEUILLE,
               (&varfreq ) *
               ROWPCTN / PRINTMISS ;
      ODS OUTPUT TABLE = espace.indicateurs (keep=PctN_1000 CODEPORTEFEUILLE &varfreq) ;
    RUN;
    proc sort data=espace.indicateurs;
    by CODEPORTEFEUILLE;
    run;
    %do i=1 %to &nvarfreq.;
    proc transpose data=espace.indicateurs out=espace.indicateurs_&i (drop=_NAME_ _LABEL_) prefix=%scan(&varfreq,&i,' ')_;
    ID %scan(&varfreq,&i,' ');
    by CODEPORTEFEUILLE;
    VAR PctN_1000;
    %end;
    data espace.indicateurs;
    merge espace.indicateurs_:;
    run;
    proc datasets lib=espace;
        delete indicateurs_:;
    run;
    %mend;

  12. #12
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Attention, la variable produite par la proc Tabulate qui contient le pourcentage ligne a un nom qui dépend du nombre de variables croisées dans le tableau. Ce n'est donc pas automatisé en l'état.
    J'ai essayé d'optimiser en évitant la création de tables intermédiaires. Le tout est de préparer l'information correctement avant la proc TRANSPOSE. Une étape DATA fait ça bien, avec l'aide d'un ARRAY.
    La seule condition (pour l'homogénéité de l'ARRAY) est que toute les variables croisées dans le tableau soient de type caractère.
    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
    %MACRO calculfreq (table, varBy, var) ;
    	ODS EXCLUDE ALL ;
    	PROC FREQ DATA=&table ;
    	  TABLE &varBy*
    	           (&var) / NOCOL NOPERCENT NOFREQ MISSING ;
    	  ODS OUTPUT crossTabFreqs = indicateurs (WHERE=(rowPercent IS NOT MISSING));
    	RUN ;
    	ODS SELECT ALL ;
    	PROC SORT DATA=work.indicateurs ;
    	  BY &varBy;
    	RUN ;
    	DATA work.indicateurs ;
    	  SET work.indicateurs ;
    	  LENGTH col $ 32 ;
    	  ARRAY variables $ &var ;
    	  DO OVER Variables ;
    	    IF UPCASE(VNAME(Variables))=UPCASE(SCAN(table,3," *")) THEN DO ;
    		  IF MISSING(Variables) THEN variables="N_A" ;
    	      col = CATX("=",VNAME(Variables),VVALUE(Variables)) ;
    		END ;
    	  END ;
    	RUN ;
    	PROC TRANSPOSE DATA=work.indicateurs OUT=work.indicateurs (DROP=_name_ _label_) ;
    	  BY make ;
    	  ID col ;
    	  VAR rowPercent ;
    	  FORMAT _NUMERIC_ 12.1 ;
    	RUN ;
    %MEND calculFreq ;
    Et un exemple d'exécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DATA work.cars ;
      SET sashelp.cars ;
      LENGTH cyl $ 2 ;
      LABEL cyl="Cylinders number" ;
      cyl = PUT(cylinders,2.-L) ;
      IF cylinders > 6 OR cyl="." THEN cyl=" " ;
    RUN ;
    %calculfreq (table=work.cars, varBy=make, var=type origin drivetrain cyl) ;

  13. #13
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    merci c'est très gentil pour le code et il fonctionne parfaitement
    mais comme je touche à SAS depuis peu je ne comprend pas toutes les instructions
    Est ce que tu pourrais m'inserer quelques lignes de commentaires stp?

  14. #14
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Quelles sont les lignes que tu ne comprends pas ?
    Sais-tu comment fonctionne un Array ?

  15. #15
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    vaguement je viens de découvrir l'array ce matin
    c'est pour manipuler plusieurs variables c'est ça?

    je n'ai pas compris toute cette ligne de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DO OVER VARIABLES ;
    	    IF UPCASE(VNAME(VARIABLES))=UPCASE(SCAN(TABLE,3," *")) THEN DO ;
    		  IF MISSING(VARIABLES) THEN VARIABLES="N_A" ;
    	      col = CATX("=",VNAME(VARIABLES),VVALUE(VARIABLES)) ;
    		END ;
    	  END ;

  16. #16
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Oui, l'Array sert à manipuler une série de variables de même type au sein d'une étape DATA. Il permet de faire des boucles sans macro-langage pour réitérer les mêmes opérations sur chacune des variables qui le composent.
    On boucle donc, ici, sur les variables à croiser avec la variable de base. La question est de savoir laquelle est "active" sur cette ligne de la table créée par la proc Freq, puisqu'on a une structure comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TABLE             VAR1     VAR2     VAR3   ROWPCT
    Table var1*var2   a        a               50
    Table var1*var2   a        b               50
    Table var1*var2   b        a               10
    Table var1*var2   b        b               90
    Table var1*var3   a                 a      50
    Table var1*var3   a                 b      50
    Table var1*var3   b                 a      10
    Table var1*var3   b                 b      90
    Aux 4 premières observations de l'exemple ci-dessus, on veut récupérer la valeur de la variable VAR2 car c'est elle qui est active ; aux 4 observations suivantes c'est VAR3 qui est active.
    L'idée est donc de parcourir successivement VAR2 et VAR3 (c'est la boucle DO OVER). On teste si le 3e "mot" dans la valeur de TABLE (VAR2 ou VAR3) est le même que le nom de la variable qu'on est en train de parcourir (fonction VNAME).
    Si oui, on récupère la valeur (fonction VVALUE qui permet d'inclure la présence d'un format éventuel), on concatène avec le nom de la variable et hop ! on tient les futurs noms de variables.
    Quant au test d'une valeur manquante, c'est juste pour faire plus joli.

  17. #17
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    ah d'accord j'ai compris je te remercie

  18. #18
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    finalement j'ai un autre problème en plus de calculer les profils lignes je dois calculer les effectifs

    voilà ce que j'ai fait

    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
    %MACRO calculfreq;
    	ODS EXCLUDE ALL ;
    	PROC FREQ DATA= espace.base;
    	  TABLE CODEPORTEFEUILLE *
    	           (&varfreq) / NOCOL NOPERCENT  MISSING ;
    	  ODS OUTPUT crossTabFreqs = espace.frequences ;
    	RUN ;
    	ODS SELECT ALL ;                  
    	PROC SORT DATA= espace.frequences;
    	  BY CODEPORTEFEUILLE;
    	RUN ;
    	DATA espace.frequences;
    	  SET espace.frequences;
    	  LENGTH col $ 32 ;
    	  ARRAY VARIABLES $ &varfreq;
    	  DO OVER VARIABLES ;
    	    IF UPCASE(VNAME(VARIABLES))=UPCASE(SCAN(TABLE,3," *")) THEN DO ;
    		  IF MISSING(VARIABLES) THEN VARIABLES="N" ;
    	      col = CATX("=",VNAME(VARIABLES),VVALUE(VARIABLES)) ;
    		END ;
    	  END ;
    	RUN ;
    	PROC TRANSPOSE DATA= espace.frequences OUT= espace.frequences (DROP=_name_ _label_) ;
    	  BY CODEPORTEFEUILLE ;
    	  ID col ;
    	  VAR rowPercent Frequency ;
    	  FORMAT _NUMERIC_ 12.1 ;
    	RUN ;
    %mend;
    mais ça ne marche pas

  19. #19
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 422
    Par défaut
    Bon j'ai fait comme ça le programme marche mais je voudrais savoir est ce qui serait possible de n'avoir qu'une proc transpose qui regroupe toute l'information

    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
    %MACRO calculfreq;
    	ODS EXCLUDE ALL ;
    	PROC FREQ DATA= espace.base;
    	  TABLE CODEPORTEFEUILLE *
    	           (&varfreq) / NOCOL NOPERCENT  MISSING ;
    	  ODS OUTPUT crossTabFreqs = espace.frequences (WHERE=(rowPercent IS NOT MISSING and Frequency IS NOT MISSING));
    	RUN ;
    	ODS SELECT ALL ;                  
    	PROC SORT DATA= espace.frequences;
    	  BY CODEPORTEFEUILLE;
    	RUN ;
    	DATA espace.frequences;
    	  SET espace.frequences;
    	  LENGTH col $ 32 ;
    	  ARRAY VARIABLES $ &varfreq;
    	  DO OVER VARIABLES ;
    	    IF UPCASE(VNAME(VARIABLES))=UPCASE(SCAN(TABLE,3," *")) THEN DO ;
    		  IF MISSING(VARIABLES) THEN VARIABLES="N" ;
    	      col = CATX("=",VNAME(VARIABLES),VVALUE(VARIABLES)) ;
    		END ;
    	  END ;
    	RUN ;
    	PROC TRANSPOSE DATA= espace.frequences OUT= espace.effectifs (DROP=_name_ _label_) ;
    	  BY CODEPORTEFEUILLE ;
    	  ID col ;
    	  VAR Frequency ;
    	  FORMAT _NUMERIC_ 12.1 ;
    	RUN ;
    		PROC TRANSPOSE DATA= espace.frequences OUT= espace.pro_ligne (DROP=_name_ _label_) ;
    	  BY CODEPORTEFEUILLE ;
    	  ID col ;
    	  VAR rowPercent ;
    	  FORMAT _NUMERIC_ 12.1 ;
    	RUN ;
    %mend;
    en fait je ne comprend pas pourquoi cette proc transpose ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PROC TRANSPOSE DATA= espace.frequences OUT= espace.effectifs (DROP=_name_ _label_) ;
    	  BY CODEPORTEFEUILLE ;
    	  ID col ;
    	  VAR Frequency rowPercent;
    	  FORMAT _NUMERIC_ 12. ;
    	RUN ;
    merci 'daavance

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

Discussions similaires

  1. [XL-2007] Macro pour supprimer des lignes sous conditions de valeur de cellule
    Par frisco75 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/09/2011, 14h33
  2. [XL-2007] Macro pour fusionner des ligne en gardant la valeur supérieure
    Par michaeldms dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/09/2011, 13h15
  3. Macro pour grouper des lignes sur une plage qui peut varier
    Par RichRich59 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/01/2011, 13h04
  4. [Toutes versions] Création Macro pour supprimer des lignes après tests conditionnels
    Par PeaceMaker dans le forum Macros et VBA Excel
    Réponses: 26
    Dernier message: 14/01/2011, 16h00
  5. Macro pour grouper des lignes sur une plage qui peut varier
    Par girardinho dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/07/2010, 09h43

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