logo

Macro

Macro : faire un SET avec un nombre de tables variable

J’ai un nombre de tables (de 1 à 40 ou 50, il faut que soit un paramètre) et avec un SET j’en crée une seule. Comment écrire ça sans répéter 40 ou 100 fois le noms des tables dans le SET. <strong>data ww.CMb;</strong> <strong> set </strong> <strong> ww.CM1b</strong> <strong> ww.CM2b</strong> <strong> …</strong> <strong> ww.CM40b;</strong> <strong>run;</strong> Merci Bonjour, et merci de votre question. Vous pouvez utiliser un programme comme celui-ci : %MACRO empilement (nbTables) ;   DATA ww.CMb ;      SET        […]

Macro : &nomMV ne fonctionne pas !

Bonjour, Voici mon programme : <strong>%macro essai(a=);</strong> <strong> data outpct;</strong> <strong> set outpct;</strong> <strong> variable='&amp;a';/*???*/</strong> <strong> run;</strong> <strong>%mend essai;</strong> <strong>%essai(a=sonf);</strong> Je voudrais en fait que dans ma table outpct apparaisse une variable nommée « variable » dont la modalité serait ici ‘sonf’. Comment faire ? Merci d’avance.   Il suffit de mettre des doubles guillemets : « &a » , au lieu des simples. Ces derniers bloquent l’action du compilateur macro.

ODS : Récupérer le risque relatif

Bonjour, j’ai créé un fichier ODS PDF qui est une suite de tableaux réalisé avec des proc tabulate comme ceci : <strong>proc tabulate data=data.tab3 missing ;</strong> <strong> class cat ;</strong> <strong> class sonf;</strong> <strong> tables sonf all='Total',cat*(n*f=10.0 pctn='%'*f=10.1)</strong> <strong> all='Total'*(n*f=10.0 pctn='%'*f=10.1) ;</strong> <strong>run ;</strong> où chaque variable (comme ici « sonf ») est traitée en fonction de la variable « cat ». Je voudrais à chaque fois récupérer le risque relatif (proc freq option cmh) et sous chaque tableau écrire : « Le risque relatif […]

Macro : Éliminer les valeurs d’une liste1 existantes dans une liste2

Bonjour, J’ai 2 listes de variables liste1 et liste2 (2 macro variables) <strong>%let liste1= a b c ;</strong> <strong>%let liste2=(a f d) ;</strong> <strong>%let liste3=; </strong> Je souhaite comparer chaque variable de la liste1 avec toutes les variables de la liste2 pour constituer une liste3 excluant de la liste1 les variables figurant dans la liste2 (soit liste3=b c); Ci après le code que j’ai écris <strong>%do i=1 %to &amp;n;</strong> <strong>    %if %scan(&amp;liste1,&amp;i) not in &amp;liste2 %then %do;</strong> <strong>       %let liste3=liste3 […]

Macro : Renommer l’ensemble des variables d’une table SAS

Comment faire pour renommer l’ensemble des variables d’une table SAS, surtout quand il y en a plus d’une centaine ?   Si vos variables ont des noms organisés en séquences, vous pouvez les renommer d’un seul coup avec cette écriture : DATA maTable ;    SET maTable (RENAME = (v3-v15 = x20-x32)) ; RUN ; Les variables s’appellent à l’origine v3, v4, v5, …, v15 et après renommage, x20, x21, …, x32. Sinon, vous pouvez construire une table SAS avec les […]

Macro : compiler un macro-programme

Bonjour. Je souhaiterais pouvoir livrer à un utilisateur un macro-programme compilé. Comment dois-je m’y prendre, et quelles manipulations doit-il effectuer de son côté pour l’utiliser ? Merci. Déclarer une bibliothèque sur ce répertoire. LIBNAME ma_macro « c:\temp » ; Déclarer à SAS qu’on veut y mettre des macros (ou qu’il y en a déjà là). OPTIONS MSTORED SASMSTORE = ma_macro ; Exécuter le macro-programme en modifiant sa PREMIERE ligne : %MACRO mon_macro_programme (parametre1, parametre2, …) / STORE ; … %MEND mon_macro_programme ; […]

Macro : Résolution de macro-variables

Bonjour. J’ai des problèmes avec le fonctionnement des macro-variables. Par exemple, si on a : %let mvn = 1 ; %let mvtab = total ; %let mvtab1 = mois ; &&mvtab&mvn -> &mvtab1 soit mois, là je comprends. Mais : &&&mvtab&mvn -> &&mvtab1 -> &mois dans mon esprit, mais non ! Pouvez-vous m’expliquer ?   Il y a 5 règles pour la transformation d’une chaîne de caractères contenant des &. Ce sont : 1) &mv1 ==> valeur de la macro-variable […]

Macro : Comparaison de macro-variables

Bonjour, je rencontre un problème après avoir initialiser SEUIL et ECARTY à l’aide de symput, la comparaison entre ces deux valeurs ne se fait pas correctement: &SEUIL.>&ECARTY. (en vérifiant avec des put dans le log, 10.4 est inférieur à 4.5987562 !!) La comparaison avec %SYSEVALF ne fonctionne pas non plus… Merci de votre réponse   Vous n’étiez pas loin d’une solution à votre problème avec %SYSEVALF. En effet, le problème vient du fait que les valeurs des macro-variables sont traitées […]

SAS/BASE : nombre de variables généré par une proc TRANSPOSE

La procédure suivante <strong>proc transpose data=infic</strong> <strong> prefix=cnt</strong> <strong> out=outfic;</strong> <strong> var nocnt;</strong> <strong> by client; </strong> <strong>run ;</strong> va générer cnt1 à cntn. Comment récupérer le nombre de variables générées (n) dans une étape data ? Merci.   Pour mettre ce nombre dans une macro-variable, voici un premier programme : DATA _NULL_ ;    SET outfic ;    ARRAY transpose cnt: ;    CALL SYMPUT ("nbNllesVar", DIM(transpose)) ;    STOP ; RUN ; Vous récupérez le nombre de variables créées par la procédure […]

Macro : Utilisation d’une macro-variable dans un LIKE

Je voudrais utiliser dans un LIKE « %…% » la valeur d’une macro-variable à la place des … Le programme suivant ne fonctionne pas : <strong>%LET recherche = ar ;</strong> <strong>PROC PRINT DATA = sashelp.class ;</strong> <strong>    WHERE soc LIKE "%&amp;recherche%" ;</strong> <strong>RUN ;</strong> Comment résoudre ce problème ?   Il faut masquer au macro-compilateur les deux %. Pour cela, on utilisera la macro-fonction %NRQUOTE, qui masque des caractères pendant la phase de résolution (transformation du programme par le macro-compilateur)… Le macro-compilateur […]

Macro : Utiliser simultanément plusieurs catalogues SASMACR

J’ai des catalogues SASMACR de macro-programmes compilés dans plusieurs répertoires différents. Mais l’option SASMSTORE n’autorise qu’une seule bibliothèque. Comment utiliser tous mes catalogues SASMACR simultanément ?   On peut créer une seule bibliothèque qui en regroupe en fait plusieurs (depuis la version 8.0). On peut donc déclarer par ce biais plusieurs chemins pour plusieurs catalogues de macros… LIBNAME bib1 "…" ; LIBNAME bib2 "…" ; LIBNAME bibmac (bib1 bib2) ; option SASMSTORE = bibmac MSTORED ; SAS ira d’abord chercher […]

Macro : Arrêt du déroulement d’un macro-programme

J’aimerai savoir s’il est possible de faire s’arrêter le programme et annuler les éventuelles instructions suivant l’appel du MP (un sorte de break ), si une certaine condition est vérifiée. <strong>%if &amp;Nberr=0 %then %do;</strong> <strong>     « arrêter tout »</strong> <strong>%end ;</strong> Si c’est possible comment faire ? Avec les versions de SAS antérieures à la 9, on ne peut traiter le problème qu’à « l’ancienne » avec un %GOTO vers un autre point du programme (après lequel on ne fera plus rien). […]

Macro : Incrémenter une macro-variable

J’ai une macro-variable i à laquelle je voudrais ajouter 1. Quand j’écris %let i=&i+1 ; je n’obtiens pas le résultat recherché (j’ai 3+1 comme valeur de i au lieu de 4). Que faire ? Il ne faut pas perdre de vue qu’une macro-variable ne contient jamais QUE DU TEXTE. Alors quand on dit à SAS quelque chose comme %let i = &i + 1 ; pour lui ce ne sont que les caractères ‘+’ et ‘1’ ajoutés à la fin […]

Macro : Utilisation des instructions cards et datalines dans un macro programme

Je souhaite générer des tables automatiquement avec un programme sas, mais impossible d’utiliser les fonctions cards et datalines ! Quelle est l’origine du problème et existe-t-il une astuce pour y remédier ? Merci d’avance. exemple de script : <b> %macro essai; data table; input variable; cards; 1 2 3 ; run; %mend essai; %essai; ERROR: The macro ESSAI generated CARDS (data lines) for the DATA step, which could cause incorrect results. The DATA step and the macro will stop executing. […]

Macro : créer des macro-variables à partir d’un fichier texte

Bonjour, J’essaie de récupérer des données d’un fichier texte dans des macro variables sans créer une table sas en dur en utilisant data _null_. En lançant la code sas ci-après, je n’ai pas de message d’erreur mais je ne sais pas comment récupérer les données dans 2 macro variables sans faire un call symput qui est plutot basé sur une table sas en dur. Exemple: Soit le fichier Essai.txt ayant la structure suivante: a, b Toto, lulu Code sas: <b>data […]

Exportation : export sous Excel

Bonjour, Pouvez-vous me dire s’il existe une macro ou procédure qui exporte une table en fichier excel (97) directement? Merci d’avance pour votre précieuse réponse. Bonjour. Si vous possédez SAS version 8 ou 9, c’est très simple : ODS HTML FILE = "chemin et nom de votre fichier.xls" ; TITLE ; FOOTNOTE ; PROC PRINT DATA = votre_table LABEL NOOBS ; RUN ; ODS HTML CLOSE ; Vous obtiendrez ainsi une pseudo feuille Excel (en fait, c’est une page Web […]

Score : Analyse discriminante qualitative (DISQUAL)

Bonjour,

Je souhaiterai réaliser une analyse discriminante qualitative via la méthode DISQUAL. Je sais qu’il faut réaliser une ACM pour transformer les variables qualitatives en variable quantitatives et que c’est à partir des résultats des facteurs de l’ACM que je pourrai ensuite effectuer l’analyse discriminante.

Analyse de données : Macro pour dessiner les AFCM, ACP, AFC avec SAS Base

Bonjour, j’aurais aimé savoir s’il existe une petite macro pour dessiner le graphique des axes factoriels des données obtenues par la proc corresp ?
Jusqu’à présent, je ne peux que tout envoyer sous Excel et faire un lourd traitement car on ne peut avoir le nom des modamités sur le graphiques en même temps que les points…
Merci d’avance !