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 14/05/2011, 03h32   #1
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Par défaut Accéder aux variables

Bonjour,

J'ai la table suivante (TAB1):
Code :
1
2
3
4
5
6
7
date          SUC      FAR     D99      3JN ........
JAN03         647      739     85.34     23.75
FEV03         362      65.38   9837      839
.
JAN04         239      989     324       445
...........
DEC08         183      345    765        545
E je veux créer des indices pour chaque variables tq:
pour SUC: In(JAN04)= SUC(JAN04)/SUC(JAN03), In(FEV04)=SUC(FEV04)/SUC(FEV03),
..........
In(DEC08)=SUC(DEC03)/SUC(DEC03).
E t ainsi de suite pour les autres variables (FAR D99 3JN ...). En prenant toujours 2003 comme année de base.
La question que je viens de poser vous paraitra, peut être , trés simple, mais j'arrive pas à résoudre . Surtout parceque j'ai plein de variables et une longue periode.
Merci de m'aider s'il est possible.
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 18h03   #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
Salut,
Il y a peut être plus simple mais je sais faire qu'en plus complexe, t'as pas de bol, bon courage pour comprendre .

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
41
42
43
44
45
46
47
48
49
50
51
52
53
DATA TEST;
INPUT date$ SUC FAR D99;
CARDS;
JAN03 647 739   85.34 23.75
FEV03 362 65.38 9837  839
JAN04 239 989   324   445
DEC08 183 345   765   545
;
RUN;
 
PROC CONTENTS DATA=TEST OUT=OUT(WHERE =(NAME ne "date"));/* recupération du nom des variables dans la table OUT*/
RUN;
 
PROC SORT DATA=OUT;/*trie pour garder l'ordre initial*/
BY VARNUM;
RUN;
 
DATA OUT;
SET OUT;
IN=COMPRESS("IN_"!!NAME);/* création des IN, par exemple pour SUC==> IN=IN_SUC*/
RUN;
 
PROC SQL NOPRINT;
SELECT NAME INTO :NAME SEPARATED BY " " FROM OUT;/* stockage des variables en liste dans la macro NAME*/
QUIT;
%PUT La liste des VARIABLES est don: &NAME.;
 
PROC TRANSPOSE DATA=TEST(WHERE=( date="JAN03")) OUT=P;/*On ne garde que la première ligne mais en colonne*/
VAR &NAME.;
RUN;
 
DATA _NULL_;
SET P;
CALL SYMPUT("COL"!!LEFT(_N_),COL1);/* création des macros variables COL1,COL2 et COL3*/
RUN;
 
 
DATA _NULL_;
SET OUT END=EOF;
CALL SYMPUT("NAME"!!LEFT(_N_),NAME);
CALL SYMPUT("IN"!!LEFT(_N_),IN);
IF EOF THEN CALL SYMPUT("NB",_N_);/* nombre de variables*/
RUN;
 
%MACRO RATIO;
	DATA TEST;
	SET TEST;
	%DO i=1 %TO &NB.;
	&&IN&i.=&&NAME&i./&&COL&i.;
	%END;
	RUN;
%MEND RATIO;
%RATIO;
Ps: il te reste plus qu'a ne pas faire le ratio si _N_=1
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 22h15   #3
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Cela m'affiché les erreurs suivants:

Code :
1
2
 PROC CONTENTS DATA=TEST(WHERE =(NAME ne "date")) OUT=OUT;
ERROR: Variable NAME IS NOT ON file TEST
Pourtant date existe dans mon fichier, et lorsque j'ai enlevé : (WHERE =(NAME ne "date"))

j'ai recontré un autre probleme:

Code :
1
2
3
PROC TRANSPOSE DATA=TEST(WHERE=( date="JAN03")) OUT=P;
ERROR: WHERE clause operator requires compatible VARIABLES.
ERROR: The text expression length (205415) exceeds maximum length (65534). The text expression has been truncated TO 65534 characters.
.

à quoi ça du??
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 10h41   #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
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
41
42
43
44
45
46
47
48
49
50
51
52
53
DATA TEST;
INPUT date$ SUC FAR D99;
CARDS;
JAN03 647 739   85.34 23.75
FEV03 362 65.38 9837  839
JAN04 239 989   324   445
DEC08 183 345   765   545
;
RUN;
 
PROC CONTENTS DATA=TEST OUT=OUT(WHERE =(NAME ne "date"));/* recupération du nom des variables dans la table OUT*/
RUN;
 
PROC SORT DATA=OUT;/*trie pour garder l'ordre initial*/
BY VARNUM;
RUN;
 
DATA OUT;
SET OUT;
IN=COMPRESS("IN_"!!NAME);/* création des IN, par exemple pour SUC==> IN=IN_SUC*/
RUN;
 
PROC SQL NOPRINT;
SELECT NAME INTO :NAME SEPARATED BY " " FROM OUT;/* stockage des variables en liste dans la macro NAME*/
QUIT;
%PUT La liste des VARIABLES est don: &NAME.;
 
PROC TRANSPOSE DATA=TEST(WHERE=( date="JAN03")) OUT=P;/*On ne garde que la première ligne mais en colonne*/
VAR &NAME.;
RUN;
 
DATA _NULL_;
SET P;
CALL SYMPUT("COL"!!LEFT(_N_),COL1);/* création des macros variables COL1,COL2 et COL3*/
RUN;
 
 
DATA _NULL_;
SET OUT END=EOF;
CALL SYMPUT("NAME"!!LEFT(_N_),NAME);
CALL SYMPUT("IN"!!LEFT(_N_),IN);
IF EOF THEN CALL SYMPUT("NB",_N_);/* nombre de variables*/
RUN;
 
%MACRO RATIO;
	DATA TEST;
	SET TEST;
	%DO i=1 %TO &NB.;
	&&IN&i.=&&NAME&i./&&COL&i.;
	%END;
	RUN;
%MEND RATIO;
%RATIO;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 11h46   #5
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
une "fin" un peu plus simple :

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
41
42
43
44
45
46
47
48
 
DATA TEST;
INPUT date$ SUC FAR D99;
CARDS;
JAN03 647 739   85.34 23.75
FEV03 362 65.38 9837  839
JAN04 239 989   324   445
DEC08 183 345   765   545
;
RUN;
 
PROC CONTENTS DATA=TEST OUT=OUT(WHERE =(NAME ne "date"));/* recupération du nom des variables dans la table OUT*/
RUN;
 
PROC SORT DATA=OUT;/*trie pour garder l'ordre initial*/
BY VARNUM;
RUN;
 
DATA OUT;
SET OUT;
INN=COMPRESS("IN_"!!NAME);/* création des IN, par exemple pour SUC==> IN=IN_SUC*/
TEMP=COMPRESS("TMP_"!!NAME);/* création des TEMP*/
RUN;
 
PROC SQL NOPRINT;
SELECT NAME INTO :NAME SEPARATED BY " " FROM OUT;/* stockage des variables en liste dans la macro NAME*/
SELECT INN INTO :INN SEPARATED BY " " FROM OUT;
SELECT TEMP INTO :TEMP SEPARATED BY " " FROM OUT;
QUIT;
%PUT La liste des VARIABLES est &NAME.;
%PUT La liste des inn est &inn.;
%PUT La liste des temp est &temp.;
 
 
DATA test2;
   SET test;
   RETAIN &temp;
   ARRAY temp{*} &temp;
   ARRAY inn{*} &inn ;
   ARRAY var{*} &name;
   DO i=1 TO DIM(var);
      IF _n_=1 THEN DO;
         temp{i}=var{i};
      END;
      inn{i}=var{i}/temp{i};
   END;
   DROP tmp:;
RUN;
et voilà !
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 12h12   #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
Bonjour Sébastien,
As-tu remarqué que le if ne fonctionne pas?
Code :
1
2
3
IF _n_=1 THEN DO;
         temp{i}=var{i}
END;
J'étais confronté à ce problème mais j'ai pas pu trouver une solution
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 12h15   #7
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
le IF ne fonctionne pas ?

ben si ;-)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
257  DATA test2;
258     SET test;
259     RETAIN &temp;
260     ARRAY temp{*} &temp;
261     ARRAY inn{*} &inn ;
262     ARRAY var{*} &name;
263     DO i=1 TO DIM(var);
264        IF _n_=1 THEN DO;
265           temp{i}=var{i};
266        END;
267        inn{i}=var{i}/temp{i};
268     END;
269     DROP tmp:;
270  RUN;
 
NOTE:  4 observation(s) lue(s) dans la TABLE WORK.TEST.
NOTE: La TABLE WORK.TEST2 a 4 observation(s) et 8 variable(s).
NOTE: L'étape DATA a utilisé (Durée totale du traitement) :
      temps réel          0.05 secondes
      temps UC            0.03 secondes
pourquoi est ce qu'il ne fonctionnerait pas ?

a+
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 12h22   #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
D'après cette partie de code
Code :
1
2
3
4
DO i=1 TO DIM(var);
      IF _n_=1 THEN DO;
         temp{i}=var{i};
      END;
Pour moi les IN_var= var mais visiblement les IN_var=1 si _N_=1, donc le ratio a été calculé pour la première ligne.

Je sais pas comment t'expliquer clairement
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 12h27   #9
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
mais si, c'est calculé correctement ;-)

la table produite (avec les variables TEMP)

Code :
1
2
3
4
5
6
7
 
Obs  date   SUC    FAR     D99    TMP_SUC  TMP_FAR  TMP_D99   IN_SUC   IN_FAR   IN_D99  i
 
 1   JAN03  647  739.00    85.34    647      739     85.34   1.00000  1.00000    1.000  4
 2   FEV03  362   65.38  9837.00    647      739     85.34   0.55951  0.08847  115.268  4
 3   JAN04  239  989.00   324.00    647      739     85.34   0.36940  1.33829    3.797  4
 4   DEC08  183  345.00   765.00    647      739     85.34   0.28284  0.46685    8.964  4
C'est correctement calculé parce que les variables TEMP sont RETAIN : les modalités sont fixées à la première exécution du programme, sur la première observation. Ensuite, on n'y touche plus.

a+
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 12h36   #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
OK, j'ai compris.
Moi je voulais avoir ça en sortie:

Code :
1
2
3
4
5
6
Obs  date   SUC    FAR     D99    TMP_SUC  TMP_FAR  TMP_D99   IN_SUC   IN_FAR   IN_D99  i
 
 1   JAN03  647  739.00    85.34    647      739     85.34   647      739.00   85.34    4
 2   FEV03  362   65.38  9837.00    647      739     85.34   0.55951  0.08847  115.268  4
 3   JAN04  239  989.00   324.00    647      739     85.34   0.36940  1.33829  3.797    4
 4   DEC08  183  345.00   765.00    647      739     85.34   0.28284  0.46685  8.964    4
ie si _N_=1 les IN_=TEMP_ ou var si tu veux.
Je suppose qu'il aimerait garder les valeurs initiales si _N_=1 et calculer le ratio si _N_>1
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 12h43   #11
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
c'est possible (bien que très étrange)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
ATA test2;
   SET test;
   RETAIN &temp;
   ARRAY temp{*} &temp;
   ARRAY inn{*} &inn ;
   ARRAY var{*} &name;
   DO i=1 TO DIM(var);
      IF _n_=1 THEN DO;
         temp{i}=var{i};
         inn{i}=var{i};
      END;
      ELSE inn{i}=var{i}/temp{i};
   END;
   DROP tmp:;
RUN;
edit pour modif.. une instruction oubliée...
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 17h10   #12
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
J'aime tout ce que vous dites sauf qu'il m'affiche toujours :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
[ SET TEST;
ERROR: The text expression length (191716) exceeds maximum length (65534). The text expression has
       been truncated TO 65534 characters.
     RETAIN &temp;
     ARRAY temp{*} &temp;
ERROR: The text expression length (191716) exceeds maximum length (65534). The text expression has
       been truncated TO 65534 characters.
     ARRAY inn{*} &inn ;
ERROR: The text expression length (178022) exceeds maximum length (65534). The text expression has
       been truncated TO 65534 characters.
     ARRAY var{*} &name;
ERROR: The text expression length (150634) exceeds maximum length (65534). The text expression has
       been truncated TO 65534 character

Aidez les debutants!!
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 17h41   #13
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
mais vous avez combien de variables dans cette table ?

pas plus de 65534 caractères dans une macro variable et là, il semble que le plafond est crevé...

a+
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 18h21   #14
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
J'ai 13694 variables!!!
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 18h35   #15
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
alors il faut scinder les tâches...

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
41
 
DATA out1 out2 out3 out4;
SET OUT;
INN=COMPRESS("IN_"!!NAME);/* création des IN, par exemple pour SUC==> IN=IN_SUC*/
TEMP=COMPRESS("TMP_"!!NAME);/* création des IN, par exemple pour SUC==> IN=IN_SUC*/
IF _n_<3500 then output out1;
else IF _n_<7000 then output out2;
else IF _n_<10500 then output out3;
else output out4;
RUN;
 
%macro toto;
 
%do i=1 %TO 4 ;
PROC SQL NOPRINT;
SELECT NAME INTO :NAME SEPARATED BY " " FROM OUT&i;/* stockage des variables en liste dans la macro NAME*/
SELECT INN INTO :INN SEPARATED BY " " FROM OUT&i;
SELECT TEMP INTO :TEMP SEPARATED BY " " FROM OUT&i;
QUIT;
%PUT La liste des VARIABLES est &NAME.;
%PUT La liste des inn est &inn.;
%PUT La liste des temp est &temp.;
 
DATA test;
   SET test;
   RETAIN &temp;
   ARRAY temp{*} &temp;
   ARRAY inn{*} &inn ;
   ARRAY var{*} &name;
   DO i=1 TO DIM(var);
      IF _n_=1 THEN DO;
         temp{i}=var{i};
      END;
      inn{i}=var{i}/temp{i};
   END;
   DROP tmp:;
RUN;
%END;
%MEND;
 
%toto
ça devrait fonctionner...
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 19h14   #16
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Il ne me donne que les inn(10500)-->inn(13695)

et log affiche toujours:

Code :
1
2
3
4
5
6
7
ERROR: The text expression length (66500) exceeds maximum length (65534). The text expression has
       been truncated TO 65534 characters.
ERROR: The text expression length (66500) exceeds maximum length (65534). The text expression has
       been truncated TO 65534 characters.NOTE: The SAS System stopped processing this step because of errors.
WARNING: The DATA SET TEST may be incomplete.  When this step was stopped there were 0
         observations AND 17196 VARIABLES.
WARNING: DATA SET TEST was NOT replaced because this step was stopped.

Je vais tenter de créer d'autres output out(i) pour garantir un minimum de variables dans chaque out et reexecuter.
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 20h18   #17
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
alors :

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
41
42
 
DATA out1 out2 out3 out4 out5;
SET OUT;
INN=COMPRESS("IN_"!!NAME);/* création des IN, par exemple pour SUC==> IN=IN_SUC*/
TEMP=COMPRESS("TMP_"!!NAME);/* création des IN, par exemple pour SUC==> IN=IN_SUC*/
IF _n_<3000 then output out1;
else IF _n_<6000 then output out2;
else IF _n_<9000 then output out3;
else IF _n_<12000 then output out4
else output out5;
RUN;
 
%macro toto;
 
%do i=1 %TO 5 ;
PROC SQL NOPRINT;
SELECT NAME INTO :NAME SEPARATED BY " " FROM OUT&i;/* stockage des variables en liste dans la macro NAME*/
SELECT INN INTO :INN SEPARATED BY " " FROM OUT&i;
SELECT TEMP INTO :TEMP SEPARATED BY " " FROM OUT&i;
QUIT;
%PUT La liste des VARIABLES est &NAME.;
%PUT La liste des inn est &inn.;
%PUT La liste des temp est &temp.;
 
DATA test;
   SET test;
   RETAIN &temp;
   ARRAY temp{*} &temp;
   ARRAY inn{*} &inn ;
   ARRAY var{*} &name;
   DO i=1 TO DIM(var);
      IF _n_=1 THEN DO;
         temp{i}=var{i};
      END;
      inn{i}=var{i}/temp{i};
   END;
   DROP tmp:;
RUN;
%END;
%MEND;
 
%toto
par contre, avant de lancer ce programme, puisque vous avez déjà créé des variables IN_, il faut les effacer et partir d'une table "propre" avec les 13694 variables.

Code :
1
2
 
DATA test;SET test (DROP=in_:);run;
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 22h42   #18
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
Sébastien,
Pour moi il faudrait subdiviser la table en verticale car c'est le nombre de variables qui est stocké dans la macro qui dépasse et non le nombre de lignes.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 02h03   #19
Invité régulier
 
Inscription : mars 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 45
Points : 7
Points : 7
Voilà ce que j'ai fait enfin:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
DATA FAFA.out1 FAFA.out2 FAFA.out3 FAFA.out4 FAFA.out5 FAFA.out6 FAFA.out7;
SET FAFA.OUT;
INN=COMPRESS("IN_"!!NAME);
TEMP=COMPRESS("TMP_"!!NAME);
IF _n_<2000 then output FAFA.out1;
else IF _n_<4000 then output FAFA.out2;
else IF _n_<6000 then output FAFA.out3;
else IF _n_<8000 then output FAFA.out4;
else IF _n_<10000 then output FAFA.out5;
else IF _n_<12000 then output FAFA.out6;
else output FAFA.out7;
RUN;

Log a affiché les mêmes erreurs mais j'en ai pas tenu compte car j'ai eu le resultat desiré.
Mecri bcp à tous !!!
Just un petit souci :j'ai pas pu les extraire dans une table INN pour continuer à les traiter!! si j'utilise keep ou drop je dois siter 13694 variables la dedans.
Imfafa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 06h56   #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
Bonjour à tous.
Désolé d'arriver quelques heures trop tard. Je propose quand même une autre solution, au cas où.
Mon jeu d'essai :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DATA work.fafa (DROP=i j) ;
  FORMAT date MONYY7. var1-var250 8.1 ;
  ARRAY VARIABLES var1-var250 ;
  date="31DEC2002"D ;
  j=1 ;
  DO UNTIL(date="01DEC2008"D) ;
    date=INTNX("MONTH",date,j) ;
    DO i=1 TO 250 ;
	   VARIABLES(i)=RANGAM(1,200) ;
	END ;
	OUTPUT ;
  END ;
RUN ;
A mon avis, travailler avec une table courte (en nombre de lignes) et large n'est pas spécialement ce qu'il y aura de plus simple sous SAS. Une organisation des mêmes données en une longue table serait plus facile à manipuler, au moins pour faire les indices, et sans doute aussi quelques autres manipulations.
La table "en hauteur" ressemblerait à ça :
Code :
1
2
3
4
5
 
__DATE___ANNEE___MOIS____INDICATEUR___VALEUR
_JAN2003__2003_____1________SUC_________647
_FEB2003__2003_____2________SUC_________362
...
Il y aurait une ligne par mois et par indicateur, avec une colonne unique pour contenir toutes les valeurs. J'en profiterais aussi pour décomposer la date en mois et année, plus faciles à manipuler séparément.
Pour obtenir cette forme, il faudrait transposer en premier lieu.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
PROC TRANSPOSE DATA=work.fafa 
                OUT=work.fafa2 (RENAME=(_name_=indicateur
				                        col1=valeur)) ;
  BY date ;
RUN ;
DATA work.fafa2 ;
  LENGTH mois annee 3 ;
  SET work.fafa2 ;
  LABEL indicateur=" " ;
  mois=MONTH(date) ;
  annee=YEAR(date) ;
RUN ;
L'étape DATA fait un peu de nettoyage dans les intitulés en plus de créer mois et année.
Ce qui me plaît alors dans l'organisation de la table, c'est que tu peux avoir 50 indicateurs ou 10 millions sans avoir les soucis évoqués précédemment, et sans jamais avoir à les énumérer.
Pour calculer les indices il faut alors trier un peu la table pour mettre ensemble toutes les observations traitant d'un même indicateur, et à l'intérieur de ces blocs, mettre tous les mois (janvier 2003 à janvier 2008, février 2003 à février 2008, ...) ensemble.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PROC SORT DATA=work.fafa2 ;
  BY indicateur mois annee ;
RUN ;
DATA work.fafa2 (DROP=valeurBase) ;
  SET work.fafa2 ;
  BY indicateur mois ;
  RETAIN valeurBase ;
  IF FIRST.mois THEN valeurBase=valeur ;
  indice = valeur / valeurBase ;
  indice_chaine = valeur / LAG(valeur) ;
  IF FIRST.mois THEN indice_chaine=. ;
RUN ;
PROC SORT DATA=work.fafa2 ;
  BY indicateur date ;
RUN ;
Dans l'étape DATA, on utilise les recettes déjà proposées par Brice et Sébastien : un RETAIN pour mémoriser une valeur sur plusieurs observations (la base de l'indice dans ce cas), initialisée au début de chaque sous-bloc de mois (sous-entendu : dans un bloc d'indicateurs, vu le tri de la table).
Pour le même prix, on peut aussi calculer un indice chaîné avec une fonction LAG : on a indice_chaine(t) = valeur(t)/valeur(t-12mois).
On retrie la table au final pour la remettre dans son ordre "naturel" chronologique, en conservant les blocs d'indicateurs. Ca permettra de faire des stats et des graphiques avec un BY indicateur, toujours sans souci d'énumération des indicateurs à traiter.
Code :
1
2
3
4
5
SYMBOL i=JOIN ;
PROC GPLOT DATA=work.fafa2 ;
  BY indicateur ;
  PLOT indice * date ;
RUN ; QUIT ;
Ici on obtient les courbes de variation de tous les indices (250 dans mes données exemple et 13694 dans ton cas) sans trop se fouler.

Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h25.


 
 
 
 
Partenaires

Hébergement Web