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 29/06/2011, 16h00   #1
Invité régulier
 
Homme
SAS automation
Inscription : juin 2011
Messages : 47
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : SAS automation
Secteur : Distribution

Informations forums :
Inscription : juin 2011
Messages : 47
Points : 7
Points : 7
Par défaut Création tranche avec boucle

Bonjour,

j'ai une petite question pour vous, cela fait quelques heures que je galère à créer mes tranches via SAS.

je m'explique j'ai une table qui fait environ 120 000 lignes avec dedans deux colonnes la première un flag et la deuxième une série de valeur numérique

exemple
NA 0
P 5.053
M 6.025
G 8.035

J'aurais aimer mettre les valeurs numérique en tranche de pas de 1, mais le soucis c'est que j'ai des valeurs comprises entre 0 et 386.

J'ai donc besoin de votre aide pour écrire quelques choses d'efficace et rapide?

Merci d'avance
Elcocco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h02   #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
On peut voir ce que tu as commencé?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h07   #3
Invité régulier
 
Homme
SAS automation
Inscription : juin 2011
Messages : 47
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : SAS automation
Secteur : Distribution

Informations forums :
Inscription : juin 2011
Messages : 47
Points : 7
Points : 7
Pour l'instant j'avais commencer la méthode barbare :

If 0<=PM<1 then tranche = 'entre 0 et 1';
else if 1<=PM<2 then tranche = 'entre 1 et 2'; et ainsi de suite.

Je voulais passer par une boucle mais je bloque à ce niveau
Code :
1
2
3
4
5
6
 
DATA tranche_de_panier;
	SET panier_boucherie;
	format tranche = $20.;
	do i=&min. TO &max.;
        IF i<=PM<i+1 then tranche(i)
Elcocco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h10   #4
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
Citation:
J'aurais aimer mettre les valeurs numérique en tranche de pas de 1, mais le soucis c'est que j'ai des valeurs comprises entre 0 et 386.
tu peux expliquer?
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h15   #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
Bonjour.
La boucle est une bonne idée, mais plutôt pour créer un format. Ensuite, tu appliques ton format de manière légère (instruction FORMAT, la variable garde sa vraie valeur stockée) ou en créant une nouvelle variable texte (fonction PUT).
Pour créer ton format, il faut une étape DATA qui génère les variables suivantes : FMTNAME, TYPE, START, END et LABEL. Plus EEXCL pour indiquer l'ouverture à droite de l'intervalle.
La table ainsi créée est mise en entrée de la proc Format via l'option CNTLIN.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DATA work.format ;
  fmtname="tranche" ; /* nom du format */
  type="N" ; /* format numérique */
  DO i=0 TO 386 ;
    start=i ; /* borne inf */
	end=i+1 ; /* borne sup */
	eexcl="Y" ; /* intervalle ouvert à droite : [i;i+1[ */
	label=COMPBL(CAT("entre ",start," et ",end)) ; /* valeur rendue par le format */
	OUTPUT ;
  END ;
RUN ;
PROC FORMAT CNTLIN=work.format ;
RUN ;
DATA work.test ; /* jeu d'essai */
  DO i=1 TO 50 ;
    x = ROUND(RANUNI(1)*386) ;
	tranche = PUT(x,tranche.) ; /* crée une variable texte avec les tranches */
    OUTPUT ;
  END ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/06/2011, 16h32   #6
Invité régulier
 
Homme
SAS automation
Inscription : juin 2011
Messages : 47
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : SAS automation
Secteur : Distribution

Informations forums :
Inscription : juin 2011
Messages : 47
Points : 7
Points : 7
Merci pour l'astuce cela marche nickel.
Grâce à cela je viens de gagner beaucoup de temps et d'énergie.
Elcocco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h32   #7
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
Sans utiliser une boucle

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
DATA test;
input id$ var;
cards;
NA 0
P 5.053
M 6.025
G 8.035
;
run;
 
proc sort DATA=test;
BY var;run;
 
 
DATA test2;
SET test;
sup=int(var);
IF sup ne 0 then do;
inf=sup-1;
end;
IF sup=0 then inf=0;
inf2=put(inf,best.);
sup2=put(sup,best.);
tranche="Entre"!!inf2!!' et '!!sup2;
DROP inf sup;
run;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/06/2011, 16h39   #8
Invité régulier
 
Homme
SAS automation
Inscription : juin 2011
Messages : 47
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : SAS automation
Secteur : Distribution

Informations forums :
Inscription : juin 2011
Messages : 47
Points : 7
Points : 7
merci pour la deuxième solution, je viens de la tester elle marche nickel je me suis juste permis de rajouter l'option COMPBL au niveau de la définition de la tranche.

Encore Merci
Elcocco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h53   #9
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
C'est propre comme ça, t'as raison!
Une petite modif pour matcher avec le programme proposé par Olivier!

Code :
1
2
3
4
5
6
7
8
9
DATA TEST2;
	SET TEST;
	sup=int(var)+1;
	inf=sup-1;
	inf2=put(inf,best.);
	sup2=put(sup,best.);
	tranche=COMPBL(CAT("Entre ",inf2," et ",sup2)) ;
	DROP inf sup;
RUN;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 17h06   #10
Invité régulier
 
Homme
SAS automation
Inscription : juin 2011
Messages : 47
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : SAS automation
Secteur : Distribution

Informations forums :
Inscription : juin 2011
Messages : 47
Points : 7
Points : 7
merci pour l'aide, je viens de m'inscrire sur le forum et j'ai été aidé rapidement c'est donc à moi maintenant de renvoyer l'appareil et d'aider si je le peux les autres forumeurs.
Elcocco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 17h28   #11
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
Allez, juste histoire de simplifier un brin...
Code :
1
2
3
4
DATA TEST2;
	SET TEST;
	tranche=COMPBL(CAT("Entre ",FLOOR(var)," et ",FLOOR(var)+1)) ;
RUN;
(pur souci esthétique de ma part)
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 17h31   #12
Invité régulier
 
Homme
SAS automation
Inscription : juin 2011
Messages : 47
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : SAS automation
Secteur : Distribution

Informations forums :
Inscription : juin 2011
Messages : 47
Points : 7
Points : 7
Efficace et rapide car méthode, je ne connaissais pas la fonction Floor
Elcocco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 17h32   #13
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h42.


 
 
 
 
Partenaires

Hébergement Web