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

Macro Discussion :

Comparaison macro variable numérique


Sujet :

Macro

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut Comparaison macro variable numérique
    Bonjour tout le monde,

    Une petite question me taraude l'esprit :
    J'ai une table Essai avec 1 ligne = 1 valeur de student, notée student&i. (i étant mon compteur). J'ai au début de mon programme calculé la valeur de student, notée &student. .

    Je souhaite ensuite comparer chaque valeur student&i. avec &student. mais mon résultat obtenu est faux puisqu'il me met 1 toujours dans la même variable, que ce soit inférieur, supérieur, ou égal.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    data compare;
    set essai;
    attrib ns length = 8;
    attrib ne length = 8;
    attrib np length = 8;
    retain ns 0; retain ne 0; retain np 0;
    if (%EVAL((-1)*(&student.))<student&i) then ns=1;  /*pour comparer avec - &student. (multiplication par -1*/
    else if (student&i < &student.) then np=1;
    else ne=1;
    run;
    si quelqu'un comprend mon problème... Mercii

  2. #2
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour, je pense qu'il nous faudra peut-être un peu plus d'explications de ta part, par exemple un exemple de ta table de départ (essai).

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Bonjour Jerome,

    Bien sur, alors voila j'ai une table avec une valeur de student, stockée dans une macro variable (&student.). A coté de ça, j'ai ma table essai qui contient plusieurs valeurs de student egalement, qui s'incrémente à chaque itération de ma boucle (donc à chaque i+1) d'où l'indicateur student&i. Je poste une copie d'écran de ma table essai si vous voulez. Et donc je voudrais que chaque itération, chaque valeur de student (donc chaque student&i.) soit comparé avec le &student. de départ. Sauf que pour le moment ma comparaison ne fonctionne pas, il me met des "1" toujours dans la même colonne alors que j'ai des valeurs inférieures, égales ou supérieures au &student.

    Merci beaucoup de votre aide!
    Images attachées Images attachées  

  4. #4
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    D'après ce que je vois tu as donc une variable "Student" contenant tes valeurs pour chaque observations et une macro variable "Student" contenant ton "seuil"

    Je ne vois pas où les Student&I sont crées, cependant dans ce que je comprend de ce que tu veux faire, ce code devrait marcher ?
    A un moment donné tu parles de boucle, et je n'en vois pas dans ton code (tout comme la définition des Student&I), donc je ne suis pas sûr d'avoir tout saisi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DATA compare;
    SET essai;
    ns=(-student>&student);
    if not ns then np=(student<&student);else np=0;
    ne=(1-np-ns);
    run;

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Oui je n'ai pas tout mis car mon code est assez long...Voici le code pour avoir ma macro variable student :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data student;
    set ref;
    call symputx("student",student);run;
    Ensuite je créé plusieurs (1000 ici) échantillons, et pour chacun je calcule student :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %macro ta(nbsim=);
    %do i=1 %to &nbsim;
    je vous épargne le tirage aléatoire... puis pour chaque valeur obtenue je créé un identifiant et je stocke dans une table :
    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
    Data student&i;
    Set student&i ;
    idperm=&i;
    Keep idperm student;
     
    data essai;
    set essai student&i;
    proc sort data = essai;
    by student;
    run ; 
     
    data compare;
    set essai;
    attrib ns length = 8;
    attrib ne length = 8;
    attrib np length = 8;
    if (student&i. GE ((-1)*&student.)) then ns=1;
    else if (&student. GE student&i.) then np=1;
    else if (&student. = student&i.) then ne=1;run;run;
    %end;
    %mend;
    %ta(nbsim=1000);
    Mon but étant de savoir combien de valeurs sont supérieures/égales/inférieures à ma valeur &student. du départ...
    Est-ce plus clair ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour,

    alors effectivement je saisi mieux, à ta place je m'y serais pris autrement, et à ce sujet je te recommande l'article récent

    http://www.developpez.net/forums/d12...faisant-choix/

    Pour reprendre ton code là ou il en est...

    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
     
    DATA student;
    SET ref;
    call symputx("student",student);run;
     
    %macro ta(nbsim=);
    %do i=1 %TO &nbsim;
     
    /*** blabla simulation ***/
     
    DATA student&i;
    SET student&i ;
    idperm=&i;
    Keep idperm student;
    RUN;
     
    %IF &i=1 %THEN %DO;DATA essai;SET Student1;RUN;%END;
    %ELSE %DO;PROC APPEND BASE=essai DATA=student&i ; RUN;%END;
     
    %END;
     
    DATA compare;
    SET essai;
    ns=(-student<&student);
    np=(1-ns)*(&student>=student);
    ne=1-ns-np;
    run;
     
    PROC SUMMARY DATA=compare;VAR ns np ne;OUTPUT OUT=resultat_sim SUM=;RUN;
     
    PROC PRINT DATA=resultat_sim;RUN;
     
    %mend;
     
    %ta(nbsim=1000);

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut Merci
    Savez vous pourquoi mes conditions avec IF student < student&i. then ... ne fonctionnaient pas ?
    Car par exemple pour un cas il y a deux conditions, ça doit être compris entre -student et + student. du coup là ce n'est pas possible... ?

  8. #8
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour,

    "oui je sais"

    student&i. est un motif à base d'une macro variable i , i valant de 1 à &nbsim (ici = 1000), donc student&i. va valoir successivement student1 jusqu'à student1000.

    Ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DATA student&i;
    SET student&i ;
    student&i désigne une table de student1 à student1000

    ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (student&i. GE ((-1)*&student.)) then ns=1;
    student&i. désigne une variable de student1 à student1000.


    Tes fichiers student&i sont créés ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA student&i;
    SET student&i ;
    idperm=&i;
    Keep idperm student;
    ils comportent une ligne et deux variables.
    La variable student contenant la valeur du student pour le i-ème tirage et provenant du fichier student&i (student1 à student1000)
    Et la variable idperm valant 1 pour student1 , 589 pour student589 etc...

    Ensuite tu créé le fichier essai en "empilant" les student&i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DATA essai;
    SET essai student&i;
    De sorte que ton fichier essai contiendra la variable student et la variable idperm , cette derniere contenant le numéro du tirage correspondant à la valeur du student.

    Ensuite tu applique le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (student&i. GE ((-1)*&student.)) then ns=1;
    aux données d'essai ( successives )

    si i=85 c'est équivalent à la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF student85 GE ((-1)*(??))
    Je ne sais pas ce qui est contenu dans la macro-variable &student , mais si tu ne l'a pas initialisé ça risque de faire une erreur (pour cela voir la log), donc on est pas bien barré , et dans le cas même ou il n'y aurait pas d'erreur le code ne marchera pas au final car essai ne contient que les variables idperm et student et n'a pas de variable "student85" donc le test aura du mal à être évaluée.

    Tu débute sans doute, il te faut faire la part entre ce qui est le code SAS, et le macro code, entre les variables SAS qui sont rattachées a des tables et les macro variables qui sont rattachées à l'éditeur de texte si on peut dire.

    Le macro code est une couche pour écrire du code SAS.

    Il est donc interprété dans un premier temps pour obtenir un fichier texte représentant le code SAS final,
    et ce n'est qu'ensuite que le code SAS sera exécuté.

    Ici tu avais un peu tout mélangé

    un code sur lequel tu peux réfléchir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DATA A;Id=1;Student=2;output;Id=2;Student=-2;output;RUN; /** définition de la variable student de la table a **/
     
    %LET Student=TONTON; /*** définition de la macro variable Student **/
     
    DATA B;
    SET A;
    &Student=3.1415926*Student;
    PUT "VALEUR de Student :  " Student ; 
    PUT 'VALEUR de &Student : ' "&Student" ;
    PUT "Valeur de &Student : " &Student ;
    RUN;
    et la log correspondante

    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
    96
    97
    98   DATA A;Id=1;Student=2;output;Id=2;Student=-2;output;RUN;
     
    NOTE: The data set WORK.A has 2 observations and 2 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds
     
     
    98 !                                                          /** définition de la variable student de
    98 !  la table a **/
    99
    100  %LET Student=TONTON; /*** définition de la macro variable Student **/
    101
    102  DATA B;
    103  SET A;
    104  &Student=3.1415926*Student;
    105  PUT "VALEUR de Student :  " Student ;
    106  PUT 'VALEUR de &Student : ' "&Student" ;
    107  PUT "Valeur de &Student : " &Student ;
    108  RUN;
     
    VALEUR de Student :  2
    VALEUR de &Student : TONTON
    Valeur de TONTON : 6.2831852
    VALEUR de Student :  -2
    VALEUR de &Student : TONTON
    Valeur de TONTON : -6.2831852
    NOTE: There were 2 observations read from the data set WORK.A.
    NOTE: The data set WORK.B has 2 observations and 3 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.01 seconds
          cpu time            0.01 seconds

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Vous avez tout compris je débute bien ^^ mais je viens de comprendre mon erreur ! Pour ça un grand merci à vous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. macro variable numérique?
    Par sofisaas dans le forum Macro
    Réponses: 10
    Dernier message: 31/05/2011, 13h35
  2. Comparaison macro-variable en format date
    Par jogin38 dans le forum Macro
    Réponses: 1
    Dernier message: 07/12/2010, 09h08
  3. Call SymputX et comparaison macro-variable
    Par Filippo dans le forum Macro
    Réponses: 5
    Dernier message: 21/05/2010, 16h05
  4. Forcer une macro variable a être numérique
    Par stefsas dans le forum Macro
    Réponses: 2
    Dernier message: 20/06/2008, 15h43
  5. Réponses: 9
    Dernier message: 14/04/2008, 11h58

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