Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/05/2011, 17h22   #1
Invité régulier
 
Femme
Inscription : mai 2011
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 30
Points : 6
Points : 6
Par défaut Calcul d'un ratio : numérateur et dénominateur dans des tables différentes

Bonjour,

J'espère que vous allez pouvoir m'aider .. Donc voilà mon pb ..
J'ai réalisé une proc means pour avoir la somme de la variable X (=somme_X).
J'ai donc 1 ligne x 1 colonne dans la table proc_means.

J'ai dans une autre table, la somme de la mm variable X mais cette fois pour les clients concernés (=somme_X_client).

Je voudrais faire un ratio en faisant :
somme_X_client/somme_X

Mais le pb, c'est que ces deux nombres sont dans deux tables différentes.
Pour réussir, j'avais pensé à rapatrier somme_X sur chaque ligne de Somme_X_client, mais je ne trouve pas de solution !
D'ailleurs si vous avez une idée plus performante, je suis toute OUÏE !

En espérant trouver de l'aide ici,
Merci !
marion.bouilly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 17h39   #2
Membre du Club
 
Homme Fabien
Inscription : novembre 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Localisation : France

Informations forums :
Inscription : novembre 2008
Messages : 59
Points : 56
Points : 56
Salut,

J'ai fait petit exemple qui devrait répondre à ta question.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* on calcul l'age moyen */
proc means DATA = sashelp.class mean noprint;
var age;
output out = aa1(DROP = _type_ _freq_) mean=age_moyen;
run;
/* on recupere cet age dans une variable */
DATA _null_;
	SET aa1;
call symput('var_age_moyen',age_moyen);
run;
/* on met cette variable dans 1 colonne */
DATA aa2;
	SET sashelp.class;
	age_moyen = &var_age_moyen.;
run;
Suistrop
suistrop est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/05/2011, 17h40   #3
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
bonjour Marion,

plein de façon de faire ceci, tu peux passer par une macro variable par exemple

Code :
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
 
DATA a;
input client $7. vente 8.;
datalines;
client1 54
client2 870
client3 45
client1 23
client4 500
client3 580
client6 85
client7 487
client8 620
;
 
proc summary DATA=a;
class client;
var vente;
types client;
output out=somme_client sum=somme_client; 
 
proc summary DATA=a;
var vente;
output out=total sum=total;
 
%macro total;
* le total contenu dans la TABLE total est mis dans la macro variable mvar_total;
DATA _null_; SET total; call symput('mvar_total',total);run;
 
* ON affecte le contenu de mvar_total à la nouvelle variable total de somme_client;
DATA somme_client;
SET somme_client;
DROP _freq_ _type_;
total=&mvar_total;
run;
%mend;
 
%total;
 
proc print DATA=somme_client;run;
Code :
1
2
3
4
5
6
7
8
9
                               Obs    client     client    total
 
                                1     client1       77      3264
                                2     client2      870      3264
                                3     client3      625      3264
                                4     client4      500      3264
                                5     client6       85      3264
                                6     client7      487      3264
                                7     client8      620      3264

Bien suistrop a été plus rapide ^^ , par contre je viens d'apprendre qu'on peut utiliser des macro variable en dehors des macros...
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 17h43   #4
Membre du Club
 
Homme Fabien
Inscription : novembre 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Localisation : France

Informations forums :
Inscription : novembre 2008
Messages : 59
Points : 56
Points : 56
Salut jerome_pdv2,

Une autre soluce plus courte mais en sql.

Code :
1
2
3
proc sql ;
CREATE TABLE aa3 AS  SELECT *,mean(age) AS age_moyen FROM  sashelp.class  ;
quit ;
Suistrop
suistrop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 18h03   #5
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
Salut suistrop

Oui...

mais je ne sais pas si dans son problème la somme totale est la somme de ses clients (peut-être qu'il y a des clients ailleurs ? )

Si tous les clients sont là, on peut se contenter d'une simple étape DATA aussi si on a conservé le _type_=0 dans la summary des clients ce qui évite de faire une deuxième summary pour le total au passage.

Code :
1
2
3
4
5
6
7
8
9
10
11
 
proc summary DATA=a;
class client;
var vente;
output out=somme_client sum=somme_client; 
run;
 
DATA somme_client; SET somme_client;
retain total;
IF _type_=0 then do;total=somme_client;DELETE;end;
DROP _type_ _freq_;run;
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 09h50   #6
Invité régulier
 
Femme
Inscription : mai 2011
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 30
Points : 6
Points : 6
Merci Jerome_pdv2 et suistrop !
Vous m'avez rendu un grand service ! je vais utiliser l'hitoire de la macro variable que je comprend tout à fait !


Merci pour votre aide,
En espérant vous retrouvez si j'ai d'autres soucis !

Marion
marion.bouilly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 10h30   #7
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Par défaut if _n_=1 then set

Bonjour,
Je vous donne la solution la moins fastidieuse.


Code :
1
2
3
4
5
6
 
DATA table_resultat;
 IF _n_=1 then SET table_contenant_la_moyenne;
 SET table_de_toutes_les_observations;
 ratio=somme_X_client/somme_X;
run;
somme_X est retenue "naturellement" comme toute variable provenant d'un set.
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h50.


 
 
 
 
Partenaires

Hébergement Web