Les posteurs les plus actifs de la semaine
Eric Wajnberg
 
Catz
 
cicino
 
Anny_Nina
 


OUTPUT dans l'etape Data

Voir le sujet précédent Voir le sujet suivant Aller en bas

OUTPUT dans l'etape Data

Message par cedsoft le Mar 21 Avr 2015 - 19:24

Bonjour,

j'aimerais à partir d'une étape data produire plusieurs tableaux. Je le fais tout simplement avec l'aide de OUTPUT. Sachant que la table tab contient pres de 11 million d'observations.

exemple:

data tab1 tab2;
 set lib.tab;
 if signal = A and temps = 2 then output tab1;
 else output tab2;
run;

Maintenant ca va se compliquer un peu:

J'ai le tableau suivant: (T designe le temps (en mois), signal = signal généré, Test verifie si le signal est bon)

T  signal  Test

1   A      1
1   B      0
1   A      0
2   A      1
2   A      1
2   B      0
2   B      1
3   A      0
4   A      0
4   A      1
4   B      0
4   B      1
4   B      1
4   B      1
4   B      1

J'aimerais obtenir au final 2 tableaux qui contenant d'une part le  signal A et de l'autre le signal B (le cas Test = 1), tout en calculant pour chacun des temps (T) le nombre de fois que ce signal apparait. Pour résumer j'aimerais obtenir donc

tableau 1
T  signal   compteur
1    A             1
2    A             2
3    A             0
4    A             1

tableau2
T  signal   compteur
1    B             0
2    B             1
3    B             0
4    B             4

Merci d'avance.

cedsoft

Nombre de messages : 21
Date d'inscription : 01/12/2014

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par niaboc le Mar 21 Avr 2015 - 20:02

Bonsoir,

tu peux le faire en deux fois à l'aide de proc sql :

Code:
Proc sql ;
    Create table tableau1 as
        Select T, signal, sum(test) as compteur
        From lib.tab
        Where signal=”A”
        Group by 1, 2;
Quit;

Proc sql ;
    Create table tableau2 as
        Select T, signal, sum(test) as compteur
        From lib.tab
        Where signal=”B”
        Group by 1, 2;
Quit;

Niaboc
avatar
niaboc

Nombre de messages : 923
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par cedsoft le Mer 22 Avr 2015 - 13:00

Slt niaboc,

mais je ne comprend po en fait le Group by 1, 2;
Ca devrait etre en principe Group by T; ou bien?

cedsoft

Nombre de messages : 21
Date d'inscription : 01/12/2014

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par niaboc le Mer 22 Avr 2015 - 13:32

group by T et signal aussi, même si celui-ci a toujours la même valeur. Mais si tu ne le mets pas, il me semble que SAS ne va pas comprendre qu'il faut agréger les lignes.
avatar
niaboc

Nombre de messages : 923
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par cedsoft le Mer 22 Avr 2015 - 13:38

ah oki merci

cedsoft

Nombre de messages : 21
Date d'inscription : 01/12/2014

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par cedsoft le Mer 22 Avr 2015 - 13:45

J'aimerais maintenant faire la meme chose, mais avec une 2eme variable Test (noté Test2) qui agit comme Test et dans tableau1 et tableau2 un 2e compteur (noté compteur2). Du moins que Test Test2 compteur et compteur2 soient dans le meme tableau. Comment m'y prendre?

cedsoft

Nombre de messages : 21
Date d'inscription : 01/12/2014

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par niaboc le Jeu 23 Avr 2015 - 12:37

Sinon tu peux également faire une seule table avec toutes tes infos :

Code:
proc sql;
   create table tableau as
      select T, signal, test, test2, sum(test) as compteur, sum(test2) as compteur2
      from lib.tab
      group by 1, 2
      order by 2, 1;
quit;

Dis-moi si ça te va!

Niaboc
avatar
niaboc

Nombre de messages : 923
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par cedsoft le Mar 28 Avr 2015 - 11:38

Salut Niaboc! Sorry de n'avoir po réagi à temps car j'étais en voyage. Merci infiniment pour ton code car il fonctionne parfaitement .

cedsoft

Nombre de messages : 21
Date d'inscription : 01/12/2014

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par cedsoft le Mar 28 Avr 2015 - 11:50

Ca se complique encore un peu:

J'aimerais maintenant avoir un compteur (noté compteur3) qui pour chaque signal "A" à chaque temps "T" (1,2,3,4) compte plutot le nombre de signaux B ayant la valeur Test = 0 et vice versa (c-a-d pour chaque instant T pour le signal B, compteur3 compte le nombre de signaux A ayant Test = 0 ). J ne sais po si je me suis bien fait comprendre...

cedsoft

Nombre de messages : 21
Date d'inscription : 01/12/2014

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par niaboc le Mar 28 Avr 2015 - 14:06

Salut,

C'est effectivement plus compliqué... voici le petit bout de code que j'ai pu sortir, il y a certainement moyen de faire plus simple :

Code:
proc sql;
   create table tableau as
      select coalesce(a.T, b.T) as t
         , coalesce(a.signal, b.signal) as signal
         , test
         , test2
         , sum(test) as compteur
         , sum(test2) as compteur2
           , b.compteur3 as compteur3
      from lib.tab as a
         full join (select t
                     , case when signal="A" then "B"
                           when signal="B" then "A" end as signal
                     , sum(case when test=0 then 1 else 0 end) as compteur3
                  from tab
                  group by 1, 2) as b
         on a.t=b.t and a.signal=b.signal
      group by 1, 2
      order by 2, 1;
quit;

Dis-moi si ça fonctionne bien.

Pour les cas ou le signal B n'existe pas pour un temps T (comme pour le temps 3 dans ta petite table d'exemple), ça met un . plutôt qu'un 0.

Niaboc
avatar
niaboc

Nombre de messages : 923
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par cedsoft le Mer 29 Avr 2015 - 13:18

Salut,

ca marche parfaitement Smile merci bcp. Mais je ne comprends po bien le role de la foncton coalesce. Peux tu m'expliquer stp?

Cedric

cedsoft

Nombre de messages : 21
Date d'inscription : 01/12/2014

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par niaboc le Mer 29 Avr 2015 - 13:33

Coalesce est une fonction qui te permet de prendre la première valeur non nulle.

Je l'ai mise ici car sinon tu pouvais avoir des "." à la place des temps et signaux, en ne prenant que le a.t et a.signal.

Niaboc
avatar
niaboc

Nombre de messages : 923
Age : 30
Localisation : Paris
Date d'inscription : 05/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: OUTPUT dans l'etape Data

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

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