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

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    mai 2005
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : mai 2005
    Messages : 1
    Points : 1
    Points
    1

    Par défaut Numérotation automatique du nom des variables

    Hello,

    Je viens pour un petit problème que je n'arrive pas à résoudre.

    Dans un dataset SAS, j'ai, par observation/ligne, deux variables liste1 et liste2. Dans chaque liste, j'ai une série de numéros séparés par un tiret à chaque fois.

    Donc liste1 : 123-456-789-147-258-369 puis liste2 : 123-456-789-741-258-987

    Mon but est de comparer les nombres de liste 1 pour voir s'il se trouve tous dans liste2 et ainsi d'identifier les lignes de mon dataset où liste1 contient des nombres qui ne sont pas repris dans liste2.
    Dans mon exemple, la ligne doit être sélectionnée car liste1 contient 147 et 369 qui ne se trouvent pas dans liste2.

    Pour résoudre mon problème, j'avais pensé à essayer de créer autant de variables que j'ai de numéros. Ainsi, pour chaque ligne du dataset, je crée les variables nb1, nb2, nb3, etc en allant jusqu'au nombre maximum (dans mon cas, 7).

    Ma question : Comment puis-je, avec une boucle, créer ces variables ? J'ai initialisé une macro variable qui contient le nombre maximum issus de liste1 (s'il y a 7 nombres séparés par un tiret, la macro variable nb_max est égale à 7).


    Si vous voyez une autre option, je suis preneur aussi

    Bonne journée !

  2. #2
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    novembre 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : novembre 2017
    Messages : 63
    Points : 84
    Points
    84

    Par défaut

    Vous pouvez plus simplement créer une boucle à l'intérieur d'une étape data.
    Cette boucle devra parcourir les différents éléments de la liste1 et les comparer à liste2.

    Voici un exemple :

    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
     
    data toto;
    	length liste1 $ 50 liste2 $ 50;
    	input liste1 $ liste2 $ ;
    	datalines;
    	123-456-789-147-258-369 123-456-789-741-258-987
    	123-456-789-147-258-369 123-456-789-147-258-369
    	;
    run;
     
    data test(drop=i);
    	set toto;
    	length STATUT $ 15;
    	y = 0;
    	do i = 0 to countw(liste1,'-');
    		if index(liste2,scan(liste1,i,'-')) > 0 then y+1;
    	end;
    	if y < countw(liste1,'-') then STATUT = "SELECTIONNE";
    		else STATUT = "NON SELECTIONNE";
    	nb_not_matched = countw(liste1,'-') - y;
    run;

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

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

    Informations forums :
    Inscription : mai 2011
    Messages : 675
    Points : 1 562
    Points
    1 562

    Par défaut

    Bonjour,

    dans le cas où les listes liste1 (#n) et liste2 (#m) pourraient être un peu longues, je te propose un code en O(#m+#n).
    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
     
    data toto;
        length liste1 $ 50 liste2 $ 50;
        input liste1 $ liste2 $ ;
        datalines;
    123-456-789-147-258-369 123-456-789-741-258-987
    123-456-789-147-258-369 123-456-789-147-258-369
        ;
    run;
     
     
    DATA TITI;
    LENGTH obs 8 mot $20 ;
    SET toto;
    KEEP obs liste1 liste2 mot obs;    
    IF _N_=1     THEN     DO;
            DECLARE HASH DIC(multidata:'y');
            DIC.DEFINEKEY('mot');
            DIC.DEFINEDONE();
                        END;
                ELSE     RCDIC=DIC.CLEAR();
     
    obs=_N_;    
    NB2=COUNTW(liste2);
    IF NB2>0 THEN     DO;
        DO B2=1 TO NB2;
        mot=SCAN(liste2,B2);RCDIC=DIC.ADD();
        END;
                    END;
     
    NB1=COUNTW(liste1);
    IF NB1>0    THEN     DO;
        DO B1=1 TO NB1;
        mot=SCAN(liste1,B1);
        RCDIC=DIC.FIND();
        IF RCDIC^=0 THEN OUTPUT;
        END;
                        END;
    RUN;
    PROC PRINT DATA=TITI;RUN;
    Obs. obs mot liste1 liste2
    1 1 147 123-456-789-147-258-369 123-456-789-741-258-987
    2 1 369 123-456-789-147-258-369 123-456-789-741-258-987

    Code à adapter en fonction de tes besoins, compte tenu que tu n'as pas spécifié la structure du fichier en sortie que tu attendais.

Discussions similaires

  1. Changer le Nom des Variables
    Par suistrop dans le forum SAS Base
    Réponses: 2
    Dernier message: 06/11/2008, 14h16
  2. Mise à jour des noms des variables
    Par stefsas dans le forum SAS Base
    Réponses: 1
    Dernier message: 09/06/2008, 11h28
  3. récupération des noms des variables POST
    Par taffMan dans le forum Formulaires
    Réponses: 2
    Dernier message: 19/02/2008, 21h13
  4. Réponses: 2
    Dernier message: 20/05/2007, 18h22
  5. nom des variables pour se faciliter la vie
    Par Slumpy dans le forum VB.NET
    Réponses: 2
    Dernier message: 28/03/2007, 10h31

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