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 30/11/2011, 11h54   #1
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
Par défaut Automatisation d'un code

Bonjour,

Je dispose de la table suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA test;
INPUT 	Nom $
	A_janv A_fevr A_mars A_avri
	B_janv B_fevr B_mars B_avri
	C_janv C_fevr C_mars C_avri
	D_janv D_fevr D_mars D_avri
	Age Ville $;
CARDS;
Pierre 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 28 2 Paris
Josette 31 32 33 34 35 36 37 38 41 42 43 44 45 46 47 48 3 Toulon
Gabriel 51 52 53 54 55 56 57 58 61 62 63 64 65 66 67 68 1 Brest
Henri 71 72 73 74 75 76 77 78 81 82 83 84 85 86 87 88 5 Bordeaux
;
RUN;
Le code ci-dessous permet de regrouper dans une seule colonne les 4 valeurs (janvier, février, mars, avril) d'une même variable :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATA test1(DROP = A_: B_: C_: D_: i Calendrier);
SET test;
ARRAY a {*} A_:;
ARRAY b {*} B_:;
ARRAY c {*} C_:;
ARRAY d {*} D_:;
	Calendrier = 'Janvier Février Mars Avril';
	DO i=1 TO dim(a);
		Mois = scan(Calendrier,i,' ');
		Var_A = a(i);
		Var_B = b(i);
		Var_C = c(i);
		Var_D = d(i);
		OUTPUT;
	END;
RUN;
Mon problème est que j'ai beaucoup de variables pour lesquelles je dispose des valeurs de janvier, février, mars, avril.
Je cherche donc à automatiser le code.
Je pensais à créer une boucle avec un seul array qui ne traite qu'un groupe de 4 variables en même temps. Un truc dans le genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PROC CONTENTS DATA = test OUT = colonne NOPRINT;
RUN;
 
PROC SQL NOPRINT;
SELECT name INTO :old_var separated BY ' ' FROM colonne WHERE substr(name, INDEX(name, '_'));
SELECT substr(name, INDEX(name, '_')+1) INTO :calendrier separated BY ' ' FROM colonne WHERE substr(name, INDEX(name, '_'));
SELECT substr(name, 1, INDEX(name, '_')-1) INTO :new_var separated BY ' ' FROM colonne WHERE substr(name, INDEX(name, '_'));
SELECT count (*) INTO :nbr FROM colonne WHERE substr(name, INDEX(name, '_'));
QUIT;
 
%MACRO TEST;
DATA test1;
SET test;
ARRAY x {&nbr.} &old_var:;
	%DO i=1 %TO &nbr.;
		x(i) = &&new_var&i
		Mois(i) = %scan("&calendrier",&i,' ');
		OUTPUT;
	%END;
RUN;
%MEND TEST;
%TEST;
Ce code ne fonctionne pas et ne traduit d'ailleurs pas franchement ce que je
cherche à faire mais je m'emmêle un peu les pinceaux !

Help !?
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 12h43   #2
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
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 : 213
Points : 319
Points : 319
Bonjour

une idée avec la proc transpose, attention il y a séparation des données individus (age, nom etc..) au préalable des données "mois" (A_janv, A_fevr, etc...)
L'avantage c'est que tu n'as pas a connaitre exactement le nombre de variables tu type A_janv, B_janv, C_janv, D_janv, E_janv etc...
A la condition que leur prefixe n'entre pas en "collision" avec les clefs (_janv,_fevr,_mars,_avri).


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
 
DATA donnees;length id $6.; SET test; keep nom age ville id;id=strip(_n_);run;
 
proc transpose DATA=test(DROP=nom age ville) out=test2;
run;
 
DATA test2; SET test2;
mois=(INDEX(_name_,'_janv')^=0)*1+(INDEX(_name_,'_fevr')^=0)*2+(INDEX(_name_,'_mars')^=0)*3+(INDEX(_name_,'_avri')^=0)*4;
_name_=tranwrd(_name_,'_janv','');
_name_=tranwrd(_name_,'_fevr','');
_name_=tranwrd(_name_,'_mars','');
_name_=tranwrd(_name_,'_avri','');
run;
proc sort DATA=test2;  BY mois;run;
proc transpose DATA=test2 out=test3;
BY mois;run;
proc sort DATA=test3; BY _name_;run;
 
DATA test3;SET test3;
_name_=strip(tranwrd(_name_,'COL',''));
IF mois=1 then month='janv';
IF mois=2 then month='fevr';
IF mois=3 then month='mars';
IF mois=4 then month='avri';
DROP mois;
RENAME _name_=id;
run;
DATA test4; merge test3 donnees; BY id;DROP id;run;
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
                             Obs     A     B     C     D    month      Nom      Age    Ville
 
                               1    11    15    21    25    janv     Pierre      2     Paris
                               2    12    16    22    26    fevr     Pierre      2     Paris
                               3    13    17    23    27    mars     Pierre      2     Paris
                               4    14    18    24    28    avri     Pierre      2     Paris
                               5    31    35    41    45    janv     Josette     3     Toulon
                               6    32    36    42    46    fevr     Josette     3     Toulon
                               7    33    37    43    47    mars     Josette     3     Toulon
                               8    34    38    44    48    avri     Josette     3     Toulon
                               9    51    55    61    65    janv     Gabriel     1     Brest
                              10    52    56    62    66    fevr     Gabriel     1     Brest
                              11    53    57    63    67    mars     Gabriel     1     Brest
                              12    54    58    64    68    avri     Gabriel     1     Brest
                              13    71    75    81    85    janv     Henri       5     Bordeaux
                              14    72    76    82    86    fevr     Henri       5     Bordeaux
                              15    73    77    83    87    mars     Henri       5     Bordeaux
                              16    74    78    84    88    avri     Henri       5     Bordeaux
enfin il me semble que c'était le résultat que tu attendais.

Par contre je ne sais pas si le code va s'adapter à la volumétrie de tes données du fait du basculement des individus en variables par la proc transpose...
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/12/2011, 14h05   #3
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
Si si, c'est bien ce que j'attendais.
Merci !
Hélixe 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 00h43.


 
 
 
 
Partenaires

Hébergement Web