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 11/03/2011, 11h11   #1
Invité régulier
 
Inscription : juillet 2008
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 58
Points : 7
Points : 7
Par défaut Somme d'une variable par modalités d'une autre

Bonjour,

Les individus sont des communes, j'ai une variable région et une variable numérique.
Comment faire la somme par région?

merci de votre aide
ludo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 11h19   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Bonjour,

Code :
1
2
3
4
5
6
7
8
9
PROC SORT DATA=MATABLE;
BY REGION;
RUN;
 
PROC MEANS DATA=MATABLE;
BY REGION;
VAR mavariable_num;
OUTPUT OUT=SORTIE(DROP=_TYPE_ FREQ_) SUM=;
RUN;
Sinon tu passes par un proc SQL;

Code :
1
2
3
4
PROC SQL;
CREATE TABLE SORTIE AS SELECT REGION,SUM(mavariable_num) AS SUM 
FROM MATABLE GROUP BY REGION;
QUIT;
Bon courage
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 14h03   #3
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
Hello,

avant aussi j'utilisais les "BY" mais avec class, pas besoin de trier !

Code :
1
2
3
4
5
PROC MEANS DATA=MATABLE nway sum noprint missing;
class REGION;
VAR mavariable_num;
OUTPUT OUT=SORTIE(DROP=_TYPE_ FREQ_) SUM=;
RUN;
je n'ai pas encore vu de probleme à utiliser class.

Suistrop
suistrop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 14h38   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 18h19   #5
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Citation:
Envoyé par suistrop Voir le message
avant aussi j'utilisais les "BY" mais avec class, pas besoin de trier !
je n'ai pas encore vu de probleme à utiliser class.
Il y a quand même quelques différences pas si mineures entre CLASS et BY.
1) CLASS lit toute la table d'un seul bloc, alors que BY lit la table par morceaux. Sur une énorme volumétrie, ça fait une vraie différence, car CLASS peut générer des OUT OF MEMORY alors que BY passe impeccablement bien.
2) CLASS oblige à ajouter l'option NWAY ou une instruction WAYS à la proc MEANS pour récupérer une table (via l'instruction OUTPUT OUT, pas via l'ODS) qui ne contienne pas des agrégats intermédiaires. Par exemple, par défaut, avec BY region, j'obtiens une ligne par région dans une table SAS. Avec CLASS region, j'ai une ligne par région... plus une ligne "France entière". Bien pratique parfois, mais à filtrer dans 90% des cas.
3) visuellement, CLASS édite un seul tableau et BY en édite plusieurs. Ca dépend de l'aspect qu'on veut (et par exemple, dans ODS TAGSETS.EXCELXP on peut faire un onglet par "bloc BY" mais pas un onglet par valeur des variables de CLASS).

Et accessoirement : pas forcément besoin de trier en présence d'un BY (mais bon, chut !). Il suffit d'un index ou d'une table ordonnée par blocs.
Dans ce dernier cas, si on a d'abord toutes les observations avec la valeur 1, puis toutes celles avec 3, puis toutes celles avec 2, on dira BY maVariable NOTSORTED ; et on n'aurait pas besoin de reconstruire l'ordre correct 1 puis 2 puis 3 (ou 3 puis 2 puis 1).

Enfin, ça peut être pratique d'utiliser les 2, justement pour obtenir certaines ruptures (changement de tableau) avec cependant des stats groupées par certaines variables.

A titre perso, je fais surtout des CLASS, surtout depuis que la version 8 nous a offert les instructions WAYS et TYPES qui permettent d'être fainéant et de faire plusieurs proc Means en une seule.

Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/03/2011, 12h01   #6
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par olivier.decourt Voir le message
A titre perso, je fais surtout des CLASS, surtout depuis que la version 8 nous a offert les instructions WAYS et TYPES qui permettent d'être fainéant et de faire plusieurs proc Means en une seule.

Olivier
Bonjour Olivier,
Tu pourrais m'expliquer comment tu peux faire plusieurs proc Means en une seule? j'avais pas tilté sur le coups.
Merci!
ps: avec ton explication je prône pour l'utilisation de Class, si on peut se passer d'un tri, alors pourquoi s'en priver!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 19h05   #7
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Disons que CLASS sera très bien dans 90% des cas. Et que sinon, il faudra se souvenir que BY existe.
Pour ce que je voulais dire par "plusieurs proc Means en une seule", voilà :
Code :
1
2
3
4
5
PROC MEANS DATA=sashelp.prdsale NONOBS MEAN MEDIAN ;
  VAR actual predict ;
  CLASS country product year ;
  WAYS 0 1 2 3 ;
RUN ;
Ca fait l'équivalent de 8 proc Means avec des BY différents.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 19h39   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Thank you!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 08h35   #9
Invité régulier
 
Inscription : juillet 2008
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 58
Points : 7
Points : 7
Merci beaucoup pour votre aide.

J'ai une autre question: Les individus sont maintenant des régions et j'ai cinq variables numériques. Comment obtenir en sortie un seul individu par tableau (par sortie) ?
ludo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 09h47   #10
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par ludo35 Voir le message
Merci beaucoup pour votre aide.

J'ai une autre question: Les individus sont maintenant des régions et j'ai cinq variables numériques. Comment obtenir en sortie un seul individu par tableau (par sortie) ?
Tu veux créer autant de tables que de variables?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 16h59   #11
Invité régulier
 
Inscription : juillet 2008
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 58
Points : 7
Points : 7
euh non, autant de tables que d'individus .
ludo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 17h09   #12
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par ludo35 Voir le message
euh non, autant de tables que d'individus .
Ta variable région a combien de modalité? tu peux les lister si possible
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 17h18   #13
Invité régulier
 
Inscription : juillet 2008
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 58
Points : 7
Points : 7
les 22 régions françaises plus une "DOM-TOM".
ludo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 17h56   #14
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par ludo35 Voir le message
les 22 régions françaises plus une "DOM-TOM".
Adaptes ce programme à tes 22 fameuses régions (macro oblige)


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%LET liste= Africa Asia Canada Pacific /* liste des régions*/;
 
%MACRO SUM_REGION;
%DO i=1 %TO 4 /* i=1 %to 22 dans ton cas*/;
	%LET liste&i=%SCAN(&liste.,&i,' ');
	PROC MEANS DATA=Sashelp.Shoes nway sum noprint missing;
	class Region;
	VAR Sales Inventory Returns;
	OUTPUT OUT=sortie_&&liste&i.(WHERE=( Region="&&liste&i") DROP=_TYPE_ _FREQ_ ) SUM=;
	RUN;
%END;
 
%MEND;
 
%SUM_REGION;
Bon courage
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 18h05   #15
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
pourquoi ne passer par le by comme dans ton premier message megamind? ca crée autant de tables que d'individus
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 18h17   #16
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par Manoutz Voir le message
pourquoi ne passer par le by comme dans ton premier message megamind? ca crée autant de tables que d'individus
Je ne sais pas du tout comment générer une table par région sans passer par des macros. Comment tu feras pour nommer ces tables? c'est peut être plus facile
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 18h23   #17
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Ses individus sont les régions.. donc pas de soucis de ce côté...

du coup tu vas éxécuter 22 proc means... pas évident que ce soit plus optimisé qu'un proc sort+proc means avec un by... En tout ta syntaxe est moins digeste (de mon point de vue en tout cas.. c'est un peu faire compliqué quand on peu faire simple )
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 18h31   #18
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
c'est le principe du by

Code :
1
2
3
4
5
6
7
8
9
ods rtf file="c:\test.rtf";
proc sort DATA=sashelp.bweight out=weight;
BY married;
run;
PROC MEANS DATA=weight sum;
BY married;
VAR weight;
RUN;
ods rtf close;
A priori pas besoin de nommer les tables... de ce que je comprends de la question de ludo... mais pour le faire, suivant le besoin on peut utiliser le #byvar

http://www2.sas.com/proceedings/sugi23/Coders/p75.pdf
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 18h32   #19
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par Manoutz Voir le message
c'est un peu faire compliqué quand on peu faire simple )
C'est justement ça, pourquoi faire simple qaud on peut faire plus compliqué?
En tout cas je refléchirai à ça demain, assez pour aujourd'hui!
Bonne soirée!

Désolé!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 10h00   #20
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Mais oui, utilisons l'ODS. Et s'il faut produire plusieurs tables, pensons à ODS OUTPUT et à l'option MATCH_ALL très sous-employée (qui crée une table par bloc BY et stocke même les noms des tables dans une macro-variable).
Code :
1
2
3
4
5
6
7
8
9
10
PROC SORT DATA=sashelp.shoes OUT=work.shoes ;
  BY region ;
RUN ;
ODS OUTPUT summary (MATCH_ALL = liste_tables) = work.reg1 ;
PROC MEANS DATA=work.shoes SUM ;
  VAR sales ;
  BY region ;
RUN ;
 
%PUT liste_tables = &liste_tables ;
olivier.decourt 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 00h11.


 
 
 
 
Partenaires

Hébergement Web