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 :

Lire toutes les colonnes pour chaque ligne


Sujet :

SAS Base

  1. #1
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 244
    Points : 200
    Points
    200
    Par défaut Lire toutes les colonnes pour chaque ligne
    Bonjour,

    J'aimerais pouvoir, pour chaque ligne parcourir toutes les colonnes( cnt_x) de ma table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data one;
    	input @1 Produit $3. @5 cnt_2010 3. @10 cnt_2011 3.;
    datalines;
    P1  100  200
    P2  1    2  
    P3  13   9  
    run;
    Le résultat attendu devrait être le suivant:
    Pour chaque ligne qui comprend au moins une valeur < 10, je devrais mettre un flag à 0. Sinon, je mets le flag à 1.

    J'avais pensé faire quelque chose comme ça mais apparemment, il y a un problème pour l'appel de ma macro. (Problème à cause de la compilation de la macro et de la compilation du data step?)
    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
     
           %global a;
    %macro soustr(b);
    	%let a = %sysevalf(&b-1);
    %mend;
     
    %let a = 2012;
     
            data test;
    	format flag 3.;
    	set one;
    	do i=1 to 2;/*ici, je voudrais parcourir mes colonnes*/
           /*le problème est que &a ne change pas de valeur */
           /* j'aurais voulu faire quelque chose du style */
          /*cnt_&a < 10 afin de changer dynamiquement le nom des colonnes*/
    		%soustr(&a)
    		tmp = &a;
    		output;	
    	end;
    run;
    Pourriez-vous m'aider?

    Merci à vous

  2. #2
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    houla, c'est ta solution est bien compliquée ...
    Regarde plutôt du coté des array :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    data two (drop=i);
    set one;
    array cnt{*} cnt_:;
    do i=1 to dim(cnt);
    	if cnt{i}<10 then flag=0;
    	else flag=1;
    end;
    run;

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour Edward,
    Je crois que ton programme est incorrect car si on met 9 au lieu de 100 en appliquant ton Pgm on aura 1 alors que 9 <10 et FLAG doit être égale à 0.
    Voici un programme très court pour ce problème.
    Bon courage L007
    Cordialement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DATA one;
    	input @1 Produit $3. @5 cnt_2010 3. @10 cnt_2011 3.;
    datalines;
    P1  9    200
    P2  1    2  
    P3  13   9  
    run;
     
    DATA two; SET one; 
    FLAG =1-(min(OF cnt_:)<10); 
    RUN;
    PROC PRINT ; RUN ;

  4. #4
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 244
    Points : 200
    Points
    200
    Par défaut
    Super!

    Merci pour vos réponses.
    Effectivemment je n'avais pas pensé aux arrays et j'ignorais qu'on pouvait mettre les champs avec une instruction cnt_:

    Je viens d'adapter le programme et cela fonctionne.
    J'ai juste changé le min en max.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    data four;
    	set one;
    	flag = max(OF cnt_:);
    	flag2 = max(OF cnt_:)>=10;
    run;
    Encore un tout grand merci

  5. #5
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Citation Envoyé par hossward Voir le message
    Bonjour Edward,
    Je crois que ton programme est incorrect car si on met 9 au lieu de 100 en appliquant ton Pgm on aura 1 alors que 9 <10 et FLAG doit être égale à 0.
    Oups, bien vu ... c'est ça d'aller trop vite

    juste comme ça ci-dessous le code corrigé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DATA two (DROP=i);
    SET one;
    array cnt{*} cnt_:;
    do i=1 TO dim(cnt);
    	IF cnt{i}<10 and flag NE 1 then flag=0;
    	else flag=1;
    end;
    run;

  6. #6
    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 : 51
    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
    Points : 6 064
    Points
    6 064
    Par défaut
    A tout hasard regarde une petite simplification.

    tu peux écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if moyenne > 10 then victoire = 1; 
    else victoire = 0;
    ce qui équivaut en notation simplifiée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    victoire = (moyenne > 10);
    Dans ton cas, tu as inversé la valeur de FLAG donc je te mets un "1-" devant la condition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DATA two (DROP=i);
    SET one;
    array cnt{*} cnt_:;
    do i=1 TO dim(cnt);
    	flag  = 1- (cnt{i}<10 AND flag NE 1);
    end;
    run;
    Ca pourrait t'être utile avec beacuoup de dummy à créer.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Rebonjour L0007,

    Je pense que le bon code qui correspond à ta requête est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Soit :
    FLAG =1-(MIN(OF CNT_:)<10);
    Ou :
    FLAG =(MIN(OF CNT_:)>10);
    Cordialement

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

Discussions similaires

  1. [PROC] Tri sur les colonnes pour chaque ligne
    Par san25 dans le forum SAS Base
    Réponses: 2
    Dernier message: 02/10/2013, 12h25
  2. [WD17] Calcul résultat de 2 colonne pour chaque ligne dans une table
    Par magicien33 dans le forum WinDev
    Réponses: 5
    Dernier message: 09/09/2013, 12h28
  3. Réponses: 1
    Dernier message: 03/09/2013, 19h30
  4. Réponses: 2
    Dernier message: 28/04/2010, 12h25
  5. Dernière colonne remplie pour chaque ligne
    Par arnold95 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/05/2009, 13h28

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