IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Accéder aux variables


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut Accéder aux variables
    Bonjour,

    J'ai la table suivante (TAB1):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Cela m'affiché les erreurs suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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??

  4. #4
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    une "fin" un peu plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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à !

  6. #6
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Bonjour Sébastien,
    As-tu remarqué que le if ne fonctionne pas?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    le IF ne fonctionne pas ?

    ben si ;-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  8. #8
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    D'après cette partie de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    mais si, c'est calculé correctement ;-)

    la table produite (avec les variables TEMP)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  10. #10
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    OK, j'ai compris.
    Moi je voulais avoir ça en sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    c'est possible (bien que très étrange)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    J'aime tout ce que vous dites sauf qu'il m'affiche toujours :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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!!

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    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+

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    J'ai 13694 variables!!!

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    alors il faut scinder les tâches...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  16. #16
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Il ne me donne que les inn(10500)-->inn(13695)

    et log affiche toujours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data test;set test (drop=in_:);run;

  18. #18
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    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.

  19. #19
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Voilà ce que j'ai fait enfin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  20. #20
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Accéder aux variables static du Global.asax
    Par tscoops dans le forum ASP.NET
    Réponses: 3
    Dernier message: 10/04/2007, 14h41
  2. Accéder aux variable de la classe MyAppView
    Par greghass dans le forum MFC
    Réponses: 3
    Dernier message: 21/11/2006, 15h38
  3. Accéder aux variables se trouvant dans un autre fichier
    Par towogy dans le forum Autres langages pour le Web
    Réponses: 9
    Dernier message: 18/08/2006, 15h06
  4. [WAS 5]Accéder aux variables WAS
    Par thibaut dans le forum Websphere
    Réponses: 1
    Dernier message: 16/08/2006, 07h34
  5. Réponses: 1
    Dernier message: 07/07/2006, 14h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo