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 :

Macros variables sous SAS


Sujet :

Macro

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Macros variables sous SAS
    Bonjour,
    Excusez moi, je besoin d’aide sur le produit matriciel sous SAS macro.
    En fait j’ai une table (test6) que je dois multiplier avec elle-même (test7) pour
    obtenir une table data, puis multiplier data avec test6 pour obtenir data1, puis
    data1 avec test6 pour obtenir data2 etc. jusqu’à data100.
    Mais dès la première multiplication (test6 X test7) j’ai le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WARNING: Apparent symbolic reference OBS2 not resolved.
    ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand
           is required. The condition was: &obs2. = &obscol1.
    ERROR: The macro MAT_PRODUCT will stop executing
    Ma table est de 8 lignes et 8 colonnes. le bout de code utilisé est le suivant:
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    %MACRO mat_product(libname1 = work
    ,libname2 = work
    ,in_test6 =
    ,in_test7 =
    ,out_data = );
     
    PROC SQL NOPRINT;
    SELECT nobs INTO :obs1 FROM sashelp.vtable
    WHERE libname="%upcase(&libname1.)" AND
    memname="%upcase(&in_test6.)";
    SELECT nobs INTO :obs2 FROM sashelp.vtable
    WHERE libname="%upcase(&libname2.)" AND
    memname="%upcase(&in_test7.)";
    SELECT count(distinct name) INTO :obscol1 FROM sashelp.vcolumn
    WHERE libname="%upcase(&libname1.)" AND
    memname="%upcase(&in_test6.)";
    SELECT count(distinct name) INTO :obscol2 FROM sashelp.vcolumn
    WHERE libname="%upcase(&libname2.)" AND
    memname="%upcase(&in_test7.)";
    QUIT;
    %IF &obs2. = &obscol1. %THEN %DO;
    PROC TRANSPOSE DATA=&libname2..&in_test7. OUT=_2(DROP=_name_);
    RUN;
    DATA _1;
    SET &libname1..&in_test6.;
    RUN;
    %DO i = 1 %TO 2;
    PROC SQL NOPRINT;
    SELECT name INTO :mem&i. separated BY ' ' FROM sashelp.vcolumn
    WHERE libname="WORK" AND memname="%upcase(_&i.)";
    SELECT count(distinct name) INTO :cntmem&i. FROM sashelp.vcolumn
    WHERE libname="WORK" AND memname="%upcase(_&i.)";
    QUIT;
    DATA _&i.;
    SET _&i.;
    ind=_n_;
    %DO j = 1 %TO &&cntmem&i.;
    IF %SCAN(&&mem&i.,&j.)=. THEN %SCAN(&&mem&i.,&j.)=0;
    RENAME %SCAN(&&mem&i.,&j.) = col&i.&j.;
    %END;
    RUN;
    %END;
    %DO i = 1 %TO &obscol2.;
    PROC SQL NOPRINT;
    CREATE TABLE __&i. AS SELECT _1.ind,
    0 %DO j = 1 %TO &obs1.;
    + (col1&j. * col2&j.)
    %END; AS r&i.
    FROM _1, (SELECT * FROM _2 WHERE ind=&i.) AS A;
    QUIT;
    %END;
    PROC SQL NOPRINT;
    CREATE TABLE &out_data. AS SELECT r1 %DO i = 2 %TO &obscol2.; ,r&i.
    %END;
    FROM __1(KEEP=ind r1) %DO i = 2 %TO &obscol2.;
    LEFT JOIN __&i.(KEEP=ind r&i.) ON __1.ind = __&i..ind
    %END;;
    QUIT;
    DATA &out_data.(DROP=i);
    SET &out_data.;
    ARRAY row{&obscol2.} r1 - r%CMPRES(&obscol2.);
    DO i = 1 TO &obscol2.;
    IF row{i} < 0.00000000001 THEN row{i} = 0;
    END;
    RUN;
    PROC DATASETS LIBRARY=work MTYPE=DATA;
    DELETE _1 _2 %DO i = 1 %TO &obscol2. ;
    __&i.
    %END;;
    QUIT;
    PROC PRINT DATA=&out_data. LABEL;
    TITLE "The Product of matrix &in_test6. with &in_test7.";
    RUN;
    %END;
    %ELSE %DO;
    %PUT NOTE: The number of rows in the first matrix is not same as the
    number of columns in the other matrix, please check the
    dimensions and try again;
    %END;
    %MEND mat_product;
    %mat_product(in_test6 = temp
    ,in_test7 = temp_
    ,out_data = outprd );

    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 411
    Points
    411
    Par défaut
    Bonjour,

    Es-tu sûr qu'il y a une ligne dans sashelp.vtable qui réponde à ta sélection ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHERE libname="WORK" AND
    memname="%upcase(temp_)";
    Si ta sélection ne renvoie rien, ta macro variable n'existe pas.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Je ne suis pas trop sûr, le problème c'est que ne m'y connais pas trop en sas macro.
    Penses-tu qu'il y a une erreur dans l'attribution de mes variables?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 73
    Points : 411
    Points
    411
    Par défaut
    As-tu une table dans ta WORK qui s'appelle TEMP_ ?
    Si tu n'en as pas ta sélection dans SASHELP.vtable ne renverra rien et donc ta macro variable obs2 n'existera pas.
    Si tu ne sais pas à quoi sert SASHELP.VTABLE, fait une recherche sur google, tu comprendras mieux ta macro.

  5. #5
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Pour analyse un peu plus ton problème, ajouter ces options à ton programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    option symbolgen mprint mlogic;
    Cordialement

  6. #6
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Il faut initialiser chacune de tes macro variables OBS comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    %let obs1=0 ;
    %let obs2= 0;
    ....
    A mettre au début du macro programme.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour toutes ces réponses.
    En initialisant obs1 et obs2 ça me donne encore d'autres erreurs.

    Y a pas une méthode de faire le produit matriciel sous SAS sans iml

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 181
    Points
    181
    Par défaut
    Citation Envoyé par amabou Voir le message
    Merci pour toutes ces réponses.
    En initialisant obs1 et obs2 ça me donne encore d'autres erreurs.

    Y a pas une méthode de faire le produit matriciel sous SAS sans iml
    Bonjour,

    Regarde ce thread :
    http://www.developpez.net/forums/d10...-utiliser-iml/

    Cordialement,

Discussions similaires

  1. Exécuter une macro Excel sous SAS
    Par denis.j dans le forum SAS Base
    Réponses: 0
    Dernier message: 05/03/2010, 15h01
  2. Réponses: 5
    Dernier message: 16/09/2008, 17h28
  3. Réponses: 3
    Dernier message: 03/09/2008, 15h47
  4. [Macro] bootstrap sous sas
    Par kelmarina dans le forum Macro
    Réponses: 2
    Dernier message: 17/07/2008, 14h20

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