Forum de Statistiques
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Les posteurs les plus actifs de la semaine
Aucun utilisateur

Le Deal du moment : -17%
Casque de réalité virtuelle Meta Quest 2 ...
Voir le deal
249.99 €

Les bonnes idées SAS

2 participants

Aller en bas

Les bonnes idées SAS Empty Les bonnes idées SAS

Message par joyeux_lapin13 Sam 14 Avr 2012 - 20:26

Je créé ce topic afin que les âmes charitables puissent mettre leur macro SAS!

Le support SAS

Un lien directe vers le site du support SAS où l'on peut retrouver le détail des syntaxes avec exemple de toutes les procédures du module SAS/STAT: http://support.sas.com/documentation/cdl/en/statug/63033/HTML/default/viewer.htm#aceclus_toc.htm (regarder à gauche l'inventaire).


Dernière édition par joyeux_lapin13 le Jeu 10 Mai 2012 - 8:39, édité 2 fois
joyeux_lapin13
joyeux_lapin13

Nombre de messages : 1927
Age : 40
Localisation : Mayotte
Date d'inscription : 21/04/2010

https://lemakistatheux.wordpress.com/

Revenir en haut Aller en bas

Les bonnes idées SAS Empty Re: Les bonnes idées SAS

Message par joyeux_lapin13 Lun 23 Avr 2012 - 12:40

Parcourir colonnes (méthode itérative)

Un petit code que je trouve, personnellement, bien pratique sous SAS: il permet de créer une liste contenant le nom des variables de type qualitative (comprendre: format chaîne de caractères) et une liste contenant le nom des variables de type quantitative (comprendre: format numérique) à partir de l'ensemble des variables disposées en colonne. Soit, l'une des méthodes sous SAS pour parcourir vos colonnes une à une!


PROC CONTENTS DATA = table NOPRINT OUT = contents;
RUN;

DATA contents_num;
SET contents(WHERE = (INDEX(FORMAT,"$") <= 0));
RUN;

DATA contents_char;
SET contents(WHERE = (INDEX(FORMAT,"$") > 0));
RUN;

PROC SQL NOPRINT;
SELECT DISTINCT(NAME) INTO :list_variables_cont SEPARATED BY ' ' FROM contents_num;
SELECT COUNT(NAME) INTO :nb_variables_cont FROM contents_num;
QUIT;

PROC SQL NOPRINT;
SELECT DISTINCT(NAME) INTO :list_variables_char SEPARATED BY ' ' FROM contents_char ;
SELECT COUNT(NAME) INTO :nb_variables_char FROM contents_char ;
QUIT;

%DO iteration_cont = 1 %TO &nb_variables_cont.;

%PUT je pointe sur %SCAN(&list_variables_cont., &iteration_cont.)

%END;

%DO iteration_char = 1 %TO &nb_variables_char .;

%PUT je pointe sur %SCAN(&list_variables_char ., &iteration_char .)

%END;


NB: ce code doit figurer dans une macro.
joyeux_lapin13
joyeux_lapin13

Nombre de messages : 1927
Age : 40
Localisation : Mayotte
Date d'inscription : 21/04/2010

https://lemakistatheux.wordpress.com/

Revenir en haut Aller en bas

Les bonnes idées SAS Empty Re: Les bonnes idées SAS

Message par niaboc Lun 9 Déc 2013 - 20:20

Plusieurs façons pour connaître le nombre de ligne d'une table :

Code:
%LET DSID = %SYSFUNC(OPEN(Paysan.Base_paysan_breton_socio));
%LET NOBS = %SYSFUNC(ATTRN(&DSID,NOBS));
%LET NVARS = %SYSFUNC(ATTRN(&DSID,NVARS));
%LET RC = %SYSFUNC(CLOSE(&DSID));
%put &nobs;
%put &nvars;


Code:
proc sql noprint;
select count(*)into : nb_ligne2 from Paysan.Base_paysan_breton_socio ;
quit;

%put &nb_ligne2;




Code:
data _null_;
  set Paysan.Base_paysan_breton_socio;
  call symput("nb_ligne3", _N_);
  run;

  %put &nb_ligne3;



Code:
data test3;
  set test2 nobs=nombre;
  call symput("nb_ligne4",nombre);
run;

%put &nb_ligne4;
niaboc
niaboc

Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008

Revenir en haut Aller en bas

Les bonnes idées SAS Empty Re: Les bonnes idées SAS

Message par niaboc Lun 20 Jan 2014 - 14:00

Voici une fonction qui peut être utile : l'inverse de la fonction lagX() de SAS :

Code:

/*on crée la fonction inverselag que l'on stock dans la work.fct*/
PROC FCMP OUTLIB=work.fct.inverselag ;
   FUNCTION lead (dataset $, var $, lead) ;
      /*ouvre la table*/
      dsid = OPEN(dataset) ;
      /*nombre de ligne dans la table*/
      nb = ATTRN(dsid, "NOBS") ;
      /*fin de la table*/
      IF lead > nb THEN res = . ;
      ELSE DO ;
         /*lit la "lead"ième ligne*/
         rc = FETCHOBS(dsid, lead) ;
         /*renvoie l'observation de la colonne "VARNUM"ième colonne et écrit*/
         res = GETVARN(dsid, VARNUM(dsid, var)) ;
      END ;
      /*ferme la table*/
      rc = CLOSE(dsid) ;
      /*retourne le résultat*/
      RETURN (res) ;
   ENDSUB ;
RUN ;
QUIT ;

Code:

/*spécifie ou sont situées les fonctions créées*/
options cmplib=work.fct;

Code:

/*exemple sur une table sashelp*/
DATA work.B2 ;
  SET sashelp.air ;
  /*inverse de lag()*/
  next  = LEAD("sashelp.air", "air", _N_+1) ;
  /*inverse de lag2()*/
  next2 = LEAD("sashelp.air", "air", _N_+2) ;
RUN ;
niaboc
niaboc

Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008

Revenir en haut Aller en bas

Les bonnes idées SAS Empty Re: Les bonnes idées SAS

Message par niaboc Mer 20 Juil 2016 - 9:27

Petit bout de code pour supprimer tous les labels d'une table :

Code:
proc datasets lib=ma_lib  nolist;
    modify ma_table;
        attrib _all_ label='';
    quit;
run;

Niaboc
niaboc
niaboc

Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008

Revenir en haut Aller en bas

Les bonnes idées SAS Empty Re: Les bonnes idées SAS

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum