Forum de Statistiques
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
LEGO Icons 10331 – Le martin-pêcheur
35 €
Voir le deal

Une idée ? (proc sql)

2 participants

Aller en bas

Une idée ? (proc sql)  Empty Une idée ? (proc sql)

Message par StatLife Lun 2 Déc 2013 - 14:49

Bonjour à tous,

Je sollicite votre aide pour un problème que je rencontre en ce moment , merci de prendre le temps de lire.

Alors voila, je dispose d'une table (table 1) contenant un identifiant et quelques autres variables.

Je dispose aussi de 6 (tab1-6) autres tables beaucoup plus grosses avec la même clé identifiante.

Ce que je voudrai faire, c'est ajouter 6 colonnes à ma table 1 qui, pour chaque ligne, prennent la valeur 1 si l'identifiant à été trouvé dans la table1-6 et 0 sinon.  

J'ai une idée pour le faire avec des proc sql mais ça semble plutôt laborieux c'est assez vague pour l'instant.

Auriez vous une idée pour accomplir cela le plus rapidement et élégamment ou pensez vous que les procs sql constituent la meilleur (unique) méthode?

Merci d'avance

StatLife

Nombre de messages : 12
Date d'inscription : 11/09/2013

Revenir en haut Aller en bas

Une idée ? (proc sql)  Empty Re: Une idée ? (proc sql)

Message par niaboc Lun 2 Déc 2013 - 15:29

Bonjour,

tu peux le faire avec des "case when".

Voici un petit exemple avec 3 tables.
La table "a" représente ta table "1" et les tables "b1" et "b2" représente 2 de tes 6 tables.

Je crée, à l'aide de la proc sql, 2 indicatrices dans la table "a" lorsque les identifiants sont présents respectivement dans les tables "b1" et "b2".

Code:

/*table1*/
data a;
   input a;
   cards;
   1
   1
   2
   2
   3
   3
   ;
run;


data b1;
   input a b;
   cards;
   1 8
   1 8
   4 9
   4 9
   3 10
   3 10
   ;
run;

/*tab1-2*/
data b2;
   input a b;
   cards;
   1 8
   1 8
   2 9
   2 9
   5 10
   5 10
   ;
run;

/*création d'une indicatrice lorsque la clé est présente dans la table 'a'*/
proc sql;
   create table ab1b2 as
      select a.*
         , case when b1.a=a.a then 1 else 0 end as indic_b1
         , case when b2.a=a.a then 1 else 0 end as indic_b2
      from a
         left join b1
         on a.a=b1.a
         left join b2
         on a.a=b2.a;
quit;
C'est ok pour toi?

Niaboc
niaboc
niaboc

Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008

Revenir en haut Aller en bas

Une idée ? (proc sql)  Empty Re: Une idée ? (proc sql)

Message par StatLife Lun 2 Déc 2013 - 17:03

Salut Niaboc et merci une fois de plus !

J'essaye de bien comprendre ton code et de le faire tourner sur mes données et je te dis si je m'en sors Smile

Merci encore

StatLife

Nombre de messages : 12
Date d'inscription : 11/09/2013

Revenir en haut Aller en bas

Une idée ? (proc sql)  Empty Re: Une idée ? (proc sql)

Message par StatLife Mar 3 Déc 2013 - 18:16

Salut Niaboc,

Hélas, ça ne fonctionne pas chez moi.
Je formalise un peu pour que ça soit plus compréhensible :
Table A contient ID; Table B1-6 contient entre autre ID
Puisque ce sont uniquement les septuplés (Id présents dans la table A, indic_b1,...,indic_b6) qui m’intéressent, je n’exécute que cette portion du code:
Code:
proc sql;
   create table ab1b2b3b4b5b6 as
      select ID
         , case when a.id=b1.id then 1 else 0 end as indic_b1
             , case when a.id=b2.id then 1 else 0 end as indic_b2
       , case when a.id=b3.id then 1 else 0 end as indic_b3
        , case when a.id=b4.id then 1 else 0 end as indic_b4
         , case when a.id=b5.id then 1 else 0 end as indic_b5
       , case when a.id=b6.id then 1 else 0 end as indic_b6
 from a b1 b2 b3 b4 b5 b6;
 quit;
Et ça me retourne invariablement :

ERROR: Column id could not be found in the table/view identified with the correlation name b1
...
ERROR: Column id could not be found in the table/view identified with the correlation name b6

Alors j'ai essayé en créant les b1-6 comme ça:
Code:
proc sql;create table b1 as select distinct id from A ;quit;
Même problème...ERROR: Column id could not be found in the table/view identified with the correlation name b1

As tu déjà été confronté à ce problème ? as tu une idée pour que ça marche ?

Merci d'avance !

StatLife

Nombre de messages : 12
Date d'inscription : 11/09/2013

Revenir en haut Aller en bas

Une idée ? (proc sql)  Empty Re: Une idée ? (proc sql)

Message par niaboc Mar 3 Déc 2013 - 18:48

Il te manque les paramètres de jointure dans ta proc sql!
SAS ne peut donc pas connaître quels sont les liens entre les différentes tables.

Comme dans le petit exemple précédent, tu dois faire des 'left join' (pour garder tous les identifiants de le table 'a') et préciser quelles sont les variables de jointure.

Essaye avec :

Code:

%macro statlife;


   proc sql;
      create table ab1_6 as
         select a.ID
         %do i=1 %to 6;
            , case when a.id=b&i..id then 1 else 0 end as indic_b&i
         %end;
      from a
      %do i=1 %to 6;
         left join b&i
         on a.id=b&i..id
      %end;
      ;
   quit;

%mend statlife;

%statlife;
J'utilise des macro pour ne pas à avoir à réécrire 6 fois les mêmes choses.
niaboc
niaboc

Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008

Revenir en haut Aller en bas

Une idée ? (proc sql)  Empty Re: Une idée ? (proc sql)

Message par StatLife Mer 4 Déc 2013 - 12:23

Hello,

Bien vu pour la macro, c'est plus élégant!

En revanche, ce que j'ai oublié de préciser c'est que mes table B1 à B6 sont toutes TRèS grosses : 10 000 000 de lignes.

Du coup, avec les jointures, ça ne marche pas...je l'ai lancé avant de partir hier soir et ce matin ça me dit qu'il n'y a pas assez de place sur mon disque, alors qu'il est quasiment vide...

Qu'en penses tu ?

StatLife

Nombre de messages : 12
Date d'inscription : 11/09/2013

Revenir en haut Aller en bas

Une idée ? (proc sql)  Empty Re: Une idée ? (proc sql)

Message par niaboc Mer 4 Déc 2013 - 14:02

Bonjour,

tu pourrais faire 6 jointures, au lieu d'une jointure de 6 tables à la fois... peut-être que ça tournera :

Code:

%macro statlife;

   %do i=1 %to 6;
      proc sql;
         create table a as
            select a.ID
               , case when a.id=b&i..id then 1 else 0 end as indic_b&i
            from a
            left join b&i
            on a.id=b&i..id
      ;
      quit;
   %end;

%mend statlife;

%statlife;
ça va rajouter les colonnes dans la table 'a'.
niaboc
niaboc

Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008

Revenir en haut Aller en bas

Une idée ? (proc sql)  Empty Re: Une idée ? (proc sql)

Message par StatLife Mer 4 Déc 2013 - 18:13

haha, ouais j'avais fait ça à la main vu que j'en avais besoin ce matin mais c'est parfait avec ce code!

Merci une fois de plus Niaboc!!

StatLife

Nombre de messages : 12
Date d'inscription : 11/09/2013

Revenir en haut Aller en bas

Une idée ? (proc sql)  Empty Re: Une idée ? (proc sql)

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum