Annonce

Bienvenue sur le site support des ouvrages :
SAS - Introduction au décisionnel : méthode et maîtrise du langage
(1ère édition - épuisée)
SAS - Introduction pratique : du data management au reporting (2ème édition - épuisée)
SAS - Introduction au décisionnel : du data management au reporting (3ème édition - épuisée (hélas...))

la réponse à la question "mais où trouver la 3ème édition ?" est précisée ici


Retrouvez dans ce tiré à part, la préface écrite par Mouloud Dey, Directeur Business solutions et marchés émergents, SAS France,
l’introduction générale ainsi que le plan complet de l’ouvrage

#1 13-12-2017 08:49:24

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Autant de tables que j'ai de couples sexe / age

J'ai reçu cette nuit un mail dans lequel une utilisatrice de ce site me posait une question intéressante.

transformons cette question en sujet des beaux mercredis !

Elle dispose d'une table et souhaiterait avoir autant de tables qu'il existe, au sein de sa table principale, de couple sexe / age.

Dis autrement, elle souhaite une table regroupant les hommes de 20 ans, une autre avec les hommes de 21 ans, une autre avec les femmes de 20 ans etc. etc.

voici une petite table sur laquelle vous allez pouvoir tester vos solutions :

Code:

data test;
input sexe $ age;
cards;
H 20
H 21
F 22
F 20
H 20
H 21
F 22
F 24
H 19
H 20
;

avec cette table, vous devez construire 6 tables : tabF20 tabF22 tabF24 tabH19 tabH20 tabH21

Bien entendu, votre solution devra être la plus économe en ressources... (et s'adapter : si j'ajoute des observations à la table TEST, et qu'elles concernent d'autres ages que ceux évoqués dans cette table principale, aucune intervention de votre part ne devra avoir lieu pour que les nouvelles tables soient produites).

Il n'est donc pas question d'écrire un programme du genre :

Code:

data tabF20 tabF22 tabF24 tabH19 tabH20 tabH21;
set test;
if sexe="F" and age=20 then output tabF20;
etc.

amusez vous bien

Hors ligne

 

#2 20-12-2017 14:29:39

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Re: Autant de tables que j'ai de couples sexe / age

Reprenons

Nous avons eu deux très intéressantes propositions de la part de deux lecteurs assidus des problèmes des beaux mercredis dans le forum de discussions :

la proposition de Pierre et la proposition de Valérian

difficile de faire mieux (et la solution que j'avais préparée fait un peu pataude...).

je vous la donne quand même...

Code:

proc means data=test noprint;
class sexe age ;
ways 2 ;
var age;
output out=temp(drop=_:) n=n;
run;

data _null_; 
   set temp end=last;
   length listetab $ 500 ;
   retain listetab ;
   code=compbl("if sexe='"||compress(sexe)||"' and age="||age||" then output tab"||compress(sexe||put(age,3.)));
   listetab = catx (" ",listetab,"tab"||compress(sexe||put(age,3.)));
   call symputx(compress("code"||_n_),code);
   if last then  do ;
         call symputx ("nbcode",_n_);
         call symputx ("listetab",listetab);
   end;
run;

%macro ananas ;
data &listetab;
   set test;
   %do i=1 %to &nbcode;
      &&code&i ;
   %end;
run;
%mend;

%ananas

il m'arrive (très souvent en fait) de foncer sur la première idée qui me vient à l'esprit et de ne pas chercher à faire plus simple... et l'idée que j'avais, c'était de montrer que l'on peut aussi stocker des instructions complètes dans des macro variables.

l'étape DATA _null_ qui mobilise une table de résultats obtenus avec PROC MEANS et qui me permet de disposer de tous les couples possibles de SEXE et AGE, me permet d'obtenir un ensemble de macro variable CODE1, CODE2... qui contiennent en fait des instructions du type :

Code:

if sexe="F" and age=20 then output tabF20;

et oui.. la construction des variables CODE est un peu difficile à suivre...

j'ai ensuite une macro variable qui va contenir l'ensemble des noms de table à créer (LISTETAB) (je l'admets... un simple PROC SQL construit nettement plus facilement cette liste...) et une macro variable qui me précise mon nombre d'instructions.

Ensuite, il n'y a plus "qu'à boucler %DO" à l'intérieur d'une étape DATA...

Dans tous les cas, une seule étape DATA suffit à construire vos X tables. Pierre et Valérian n'ont utilisé en plus de cette étape DATA que PROC SQL, j'ai utilisé PROC MEANS et une DATA _NULL_...

on va dire qu'ils sortent vainqueur en terme d'utilisation des ressources ;-)

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr
Flux RSS