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 :

argument dans la fonction scan


Sujet :

Macro

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Par défaut argument dans la fonction scan
    Bonjour à tous,

    J'ai un petit problème avec la fonction scan de sas. Je m'explique : je voudrai mettre 2ème argument de la fonction une variable de ma table. Ça ne marche pas et je ne vois pas trop comment faire autrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if alea&i > %sysevalf(%scan(&fqaa,age_encours,' ')) then do;
    	etat_adh='Autonome';
    end;
    Pour info j'ai réussi avec une boucle mais le temps d'exécution est beaucoup trop long.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    %do j=1 %to 66;
    if age_encours=%eval(&j+44) then do;
    	if alea&i > %sysevalf(%scan(&hqaa,&j,' ')) then do;
    		etat_adh='Autonome';
    	end;
    %end;
    Merci d'avance.

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Par défaut


    mais tu as la fonction SCAN pour une étape DATA et non la macro %SCAN. Tu as essayé ?

  3. #3
    Membre Expert
    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
    Par défaut
    Je n'ai rien compris

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Par défaut
    Je viens d'essayer et voila la reponse dans le log :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ERROR: La fonction macro %SYSEVALF a trop d'arguments. Les arguments superflus seront ignorés.
    ERROR: Opérande de conversion %SYSEVALF 'AGE_ENCOURS' inconnu ; conversion interrompue.
    ERROR: Opérande caractère trouvé dans la fonction %EVAL ou condition %IF là où un opérande numérique
           est requis. La condition était : scan(1 2 3 4 5 6 etc

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Par défaut
    Megamind2,

    En fait je voudrais utiliser l'age de la personne comme index dans la fonction scan pour la macro-variable fqaa, ie que si la personne a 50 ans, je voudrais comparer la colonne alea&i avec la 50eme valeur de la macro-variable fqaa.

    C'est plus clair ?

  6. #6
    Membre Expert
    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
    Par défaut
    Ju ne serais pas entrain de de comparer du alpha numérique?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if alea&i > %sysevalf(%scan(&hqaa,&j,' '))
    Si c'est le cas, faudrait faire iun input

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if input(alea&i,best.) > %sysevalf(input(%scan(&hqaa,&j,' '),best.))
    Brice

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Par défaut
    Merci pour la réponse mais en fait cette manière là marche (avec la boucle), mais comme je disais le temps d'execution avec la boucle est beaucoup trop long...

    Du coup c'est pour ça que je cherche à savoir si on peut mettre le nom d'une colonne comme 2ème argument dans la fonction scan.

  8. #8
    Membre Expert
    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
    Par défaut
    ça sert à quoi si tu ne parcours pas ta macro liste hqaa. Cela veut dire que tu veux juste tester avec une seule variable?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Par défaut
    Citation Envoyé par bublibus Voir le message
    Pour info j'ai réussi avec une boucle mais le temps d'exécution est beaucoup trop long.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    %do j=1 %to 66;
    if age_encours=%eval(&j+44) then do;
    	if alea&i > %sysevalf(%scan(&hqaa,&j,' ')) then do;
    		etat_adh='Autonome';
    	end;
    %end;
    Désolé mais ça revient pas un peu ça (code qui marche mais trop long en exécution) ?

    Ce que je veux éviter justement c'est de faire une boucle.

  10. #10
    Membre Expert
    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
    Par défaut
    T'as raison, je pense que t'as pas le choix de faire une boucle

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Par défaut
    Ok merci quand même .

    Pour info (vu que c'est mon 1er post sur le forum), je peux le laisser en non résolu quand même au cas où ?

    Bonne soirée.

  12. #12
    Membre Expert
    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
    Par défaut
    Logique

    Bonne soirée!

  13. #13
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Salut.
    Peut-être que je suis mal réveillé ce matin, mais je découvre le post et je lis que tu ne peux pas travailler simultanément sur 2 tables. On peut toujours, à condition de faire une jointure (en SQL ou en étape DATA) ; on peut même imaginer des choses plus compliquées (double SET par exemple) mais ce n'est souvent pas nécessaire.
    Dans ce que je comprends de ton code :
    1) tu as chargé le contenu de toute une table dans autant de macro-variables pour éviter une jointure
    2) tu veux simuler l'évolution avec les années de la situation de N personnes, mais sans faire de boucles.
    Sur le point 1, tu fais comme tu veux, mais je pense à titre personnel qu'il vaut mieux triturer un peu les tables (avec des procédures comme Transpose) puis faire une jointure plutôt que d'aller créer des centaines de macro-variables.
    Sur le point 2, je rejoins Brice : je ne vois pas comment échapper à une boucle. Qui à mon avis n'a pas besoin d'être une boucle macro.
    Mais avant de pousser davantage, je crois que nous avons tous besoin (enfin surtout moi, mais je vais prendre un café, ça m'aidera peut-être à y voir clair) d'un exemple de données pour mieux réfléchir à ton souci.
    Je te propose ça, dis-moi si je suis à côté de la plaque.
    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
    DATA work.personnes ;
      INPUT age ;
    random = RANUNI(1) ;
    CARDS ;
    50
    46
    62
    78
    ;
    RUN ;
    DATA work.evolution ;
      LENGTH etat $ 20 ;
      ARRAY proba prob40-prob110 ;
      DO etat="Autonome", "Dépendant", "Décès" ;
        DO OVER proba ;
    	  proba = RANUNI(2) ;
    	END ;
    	OUTPUT ;
      END ;
    RUN ;
    Si les tables ressemblent un peu à ça, on peut imaginer de faire la boucle d'évolution sur la table des personnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DATA work.simulation ;
      SET work.personnes ;
      DO age_sim = age TO 110 ;
        OUTPUT ;
      END ;
    RUN ;
    Et pour pouvoir fusionner avec les probabilités de tel état à tel âge, on peut transposer les données sur les états pour faire une jointure simple au final.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    PROC TRANSPOSE DATA=work.evolution OUT=work.evolution2 (RENAME=(col1=prob)) ;
      VAR prob40-prob110 ;
      BY etat NOTSORTED ;
    RUN ;
    DATA work.evolution2 ;
      SET work.evolution2 ;
      age_sim = INPUT(COMPRESS(_name_,,"KD"),BEST12.) ; 
      /* on récupère le suffixe numérique dans les anciens noms de variables
          _NAME_="PROB50" --> (avec COMPRESS KD on ne retient que les chiffres) 
          --> "50" puis INPUT pour obtenir un nombre */
    RUN ;
    /* puis un MERGE avec comme BY age_sim ... ? */
    Mais bon, si ça se trouve, je n'ai absolument rien compris au problème ni aux données.

    Sur le fond, cependant : mélanger dans une condition de l'étape DATA des variables (connues de l'étape DATA seulement) et du langage macro (qui est exécuté avant même que l'étape DATA ne commence et qui ne connaît pas les variables SAS) ça ne peut pas fonctionner. Il y a un problème de synchronisation. On peut imaginer, si tu veux garder tes macro-variables, de passer par des fonctions SYMGET... mais je continue de penser qu'on peut vivre sans toutes ces complications.
    Bon courage.
    Olivier

  14. #14
    Membre Expert
    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
    Par défaut
    Bonjour,
    J'ai également réfléchi à ça en partant hier soir, et je me disais pourquoi ne pas créé une clé de jointure fictive cle=_N_ dans les deux tables et les joindre par la suite? et comme t'as dit Olivier, on a pas les données ou pas très bien compris .

    Brice

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 32
    Par défaut
    Bonjour,

    Pas sûr d'avoir tout compris donc je vais tester ça ce matin voir ce que ça donne.

    Bon café

  16. #16
    Membre Expert
    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
    Par défaut
    Salut,
    si ton i va de 1 à 66 aussi (ie i et j sont au même niveau ), tu peux faire comme ce que je t'ai dit ce matin, ie ta clef primaire cle=_N_. Sinon, envisage la proposition de Olivier.

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

Discussions similaires

  1. passage d'argument dans une fonction
    Par wadcyr8_197 dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2007, 09h41
  2. Généricité des Input Arguments dans une fonction
    Par RaphTIM dans le forum MATLAB
    Réponses: 5
    Dernier message: 06/06/2007, 16h28
  3. Passer un tableau PHP en argument dans une fonction javascript ?
    Par The Molo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/05/2007, 12h31
  4. Erreur d'argument dans une fonction
    Par rouliane dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/12/2006, 11h52
  5. arguments dans ma fonction main
    Par salseropom dans le forum C
    Réponses: 10
    Dernier message: 15/03/2006, 23h12

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