Les posteurs les plus actifs de la semaine
Aucun utilisateur |
Sujets les plus vus
Une idée ? (proc sql)
2 participants
Page 1 sur 1
Une idée ? (proc sql)
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
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
Re: Une idée ? (proc sql)
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".
Niaboc
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;
Niaboc
niaboc- Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008
Re: Une idée ? (proc sql)
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
Merci encore
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
Merci encore
StatLife- Nombre de messages : 12
Date d'inscription : 11/09/2013
Re: Une idée ? (proc sql)
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:
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:
As tu déjà été confronté à ce problème ? as tu une idée pour que ça marche ?
Merci d'avance !
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;
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;
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
Re: Une idée ? (proc sql)
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 :
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;
niaboc- Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008
Re: Une idée ? (proc sql)
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 ?
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
Re: Une idée ? (proc sql)
Bonjour,
tu pourrais faire 6 jointures, au lieu d'une jointure de 6 tables à la fois... peut-être que ça tournera :
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;
niaboc- Nombre de messages : 1001
Age : 37
Localisation : Paris
Date d'inscription : 05/05/2008
Re: Une idée ? (proc sql)
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!!
Merci une fois de plus Niaboc!!
StatLife- Nombre de messages : 12
Date d'inscription : 11/09/2013
Sujets similaires
» khi² de pearson-proc genmod/proc logistic
» Chi2 sous Sas : proc freq ou proc surveyfreq ?
» Proc Mixed
» Proc Summary ??
» Proc tabulate SAS
» Chi2 sous Sas : proc freq ou proc surveyfreq ?
» Proc Mixed
» Proc Summary ??
» Proc tabulate SAS
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum