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 :

observations les unes en dessous des autres => group by ?


Sujet :

SAS Base

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut observations les unes en dessous des autres => group by ?
    Bonjour,

    Je cherche à regrouper des observations de 2 tables pour lesquelles une valeur de variable est identique mais je ne veux pas que ces observations soient mises l'une à coté de l'autre mais l'une en dessous de l'autre.

    Le but final est de regrouper les noms très proches susceptibles d'être des doublons (vérification manuelle finale).

    Voici mon code:

    1ère étape: renommer variables pour le dataset C1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data C1;
    	set C;
    	identC1=trim(left(nom))!!" "!!trim(left(prenom));
    	rename idc=idcC1;
    	rename dnaissj=dnaissjC1;
    	rename dnaissm=dnaissmC1;
    	rename dnaissa=dnaissaC1;
    run;
    2ème étape: renommer variables pour le dataset C2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data C2;
    	set C;
    	identC2=trim(left(nom))!!" "!!trim(left(prenom));
    	rename idc=idcC2;
    	rename dnaissj=dnaissjC2;
    	rename dnaissm=dnaissmC2;
    	rename dnaissa=dnaissaC2;
    run;
    3ème étape: calculer distance entre chaque nom de C1 et chaque nom de C2 et garder la plus petite distance différente de 0. Rq: il peut y avoir des ex-aequo
    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
     
    proc sql ;
       CREATE TABLE work.CD AS
          SELECT C1.*,
    	 C2.*,
                 COMPLEV(C1.identC1, C.identC2) AS distance
          FROM C1, C2
    	  GROUP BY C1.identC1
          HAVING distance^= 0
       ;
    QUIT ;
     
    proc sql ;
       CREATE TABLE work.CD2 AS
          SELECT CD.*,
                 MIN(distance) AS minimum
          FROM CD
    	  GROUP BY CD.identC1
          HAVING distance = minimum 
       ;
    QUIT ;
    4ème étape: mettre un identifiant groupe pour chaque observation où on a le meme identC1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    proc sort data=CD2;
    	by IdentC1;
    run;
     
    data CD3;
    	set CD2;
    	by IdentC1;
    	retain idgp 0;
    	if first.identC1 then idgp=idgp +1;
    run;
    5ème étape: séparation en 2 datasets
    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
     
    data CD3_1 (keep = idcC1 identC1 dnaissjC1 dnaissmC1 dnaissaC1 idgp);
    	set CD3;
    run;
     
    proc sql;
    		create table CD4_1 as
    		select distinct idcC1,* from CD3_1;
    quit;
     
    data CD3_2 (keep = idcC2 identC2 dnaissjC2 dnaissmC2 dnaissaC2 idgp);
    	set CD3;
    run;
     
    proc sql;
    		create table CD4_2 as
    		select distinct idcC2,* from CD3_2;
    quit;
    6ème étape: renommer les variables des 2 datasets pour avoir les memes noms
    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
    data CD5_1;
    	set CD4_1;
    	rename identC1=ident;
    	rename idcC1=idc;
    	rename dnaissjC1=dnaissj;
    	rename dnaissmC1=dnaissm;
    	rename dnaissaC1=dnaissa;
    run;
     
    data CD5_2;
    	set CD4_2;
    	rename identC2=ident;
    	rename idcC2=idc;
    	rename dnaissjC2=dnaissj;
    	rename dnaissmC2=dnaissm;
    	rename dnaissaC2=dnaissa;
    run;
    7ème étape: assemblage des datasets par idgp - ne marche pas car j'obtiens pleins de lignes avec le meme idgp (avec ou sans le group by)
    je voudrais:
    idcC1 idgpA
    idcC2 idgpA
    idcC3 idgpA
    idcC4 idgpB
    idcC5 idgpB
    idcC6 idgpC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    proc sql ;
       CREATE TABLE work.CD6 AS
          SELECT CD5_1.*,
    	  		 CD5_2.*
          FROM CD5_1, CD5_2
    GROUP BY idgp
       ;
    QUIT ;


    Merci de votre aide.

  2. #2
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    ne marche pas car j'obtiens pleins de lignes avec le meme idgp
    Normal tu fais un produit cartésien

    Essaie une jointure par idgp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    proc sql ;
       CREATE TABLE work.CD6 AS
          SELECT CD5_1.*,
    	  		 CD5_2.*
          FROM CD5_1, CD5_2
          WHERE CD5_1.idgp = CD5_2.idgp
       ;
    QUIT ;
    Steel

  3. #3
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Salut,

    Merci pour ta réponse. Mais en fait, la jointure ne me donne pas ce que je souhaite car ça associe les lignes avec le meme idgp mais dans le sens de la ligne (je sais pas si je suis très claire...) donc comme en plus j'avais renommé les variables de mes 2 datasets avec les memes noms, ça fait que ça me les écrase.

    Bref, je sais pas à quoi je pensais vendredi (fin de semaine, fatiguée ) mais ce que je cherche à faire se fait avec un set oui 3 fois car j'ai vraiment honte, dsl.

    Merci

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

Discussions similaires

  1. [XL-2007] copier la ligne les une en dessous des autres
    Par pilounet54 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/03/2012, 14h20
  2. Ajout d'une zone de texte dynamiqument (les unes en dessous des autres)
    Par beegees dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/04/2010, 01h54
  3. Réponses: 4
    Dernier message: 21/10/2009, 11h17
  4. Réponses: 10
    Dernier message: 16/03/2009, 15h41
  5. Coller cellules les unes en dessous des autres
    Par sethipremier dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/01/2007, 14h18

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