Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/08/2011, 15h27   #1
Invité de passage
 
Homme Blaire Bailli
Étudiant
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Blaire Bailli
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : août 2011
Messages : 7
Points : 3
Points : 3
Par défaut Modifier la présentation d'un jeu de donnée

Salut à tous , je suis un peu nouveau avec la programmation sas , es ce que quelqu'un pourrait m'aider avec un programme sas me permettant de passer de la table A à la table B, la variable T est numérique et les autres sont alpha-numériques
merci d'avance

Table A
X Y Z T
1 I a 4
1 I b 5
2 III C 1
2 III H 3
2 III E 4
3 II s 8
3 II u 7

Table B

X Y Z T
1 I a, b 9
2 III c,h,e 8
3 II s, u 15
bailliblaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 16h23   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour Blaire.
Je te propose de travailler en 3 temps : d'abord deux transpositions de tes variables Z et T, séparément l'une de l'autre, puis une jointure des 2 tables transposées, au cours de laquelle tu pourras fusionner les valeurs (texte avec CATX et numériques avec SUM).
Code :
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
DATA work.tableA ;
  INPUT X $ Y $ Z $ T ;
DATALINES ;
1 I a 4
1 I b 5
2 III C 1
2 III H 3
2 III E 4
3 II s 8
3 II u 7
;
RUN ;
PROC TRANSPOSE DATA=work.tableA OUT=work.tableA1 PREFIX=T ;
  VAR t ;
  BY x y ;
RUN ;
PROC TRANSPOSE DATA=work.tableA OUT=work.tableA2 PREFIX=z ;
  VAR z ;
  BY x y ;
RUN ;
DATA work.tableB (KEEP=x y z t) ;
  MERGE work.tableA1
        work.tableA2 ;
  BY x y ;
  z = CATX(",", OF z1-z3) ;
  t = SUM(OF t1-t3) ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 16h53   #3
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Il y a aussi plus rapide, mais je trouve cette solution moins évidente : en une seule étape DATA, on cumule au fur et à mesure les valeurs de T et Z dans de nouvelles variables. Les fonctions utilisées sont les mêmes que précédemment, CATX et SUM. Mais ce qui change, ce sont :
* les FIRST et LAST (disponibles grâce au BY) qui indiquent si on commence ou termine un bloc de valeurs de X*Y
* l'instruction OUTPUT qui écrit le contenu de la mémoire dans la table en sortie (quand OUTPUT est explicite, l'écriture n'intervient que quand la condition est vraie. Quand OUTPUT est implicite, chaque observation est écrite dans la table en sortie)
* le RETAIN qui protège les variables de cumul et évite qu'on perde leurs valeurs d'une ligne à une autre
* le CALL MISSING pour initialiser les variables à chaque nouveau bloc
* le LENGTH qui permet d'indiquer à SAS le type (présence d'un $ = texte) et le nombre d'octets à réserver pour stocker une valeur des nouvelles variables.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DATA work.tableA ;
  INPUT X $ Y $ Z $ T ;
DATALINES ;
1 I a 4
1 I b 5
2 III C 1
2 III H 3
2 III E 4
3 II s 8
3 II u 7
;
RUN ;
DATA work.tableB (DROP=z t 
                RENAME=(zCum=z tCum=t)) ;
  SET work.tableA ;
  BY x y ;
  LENGTH zCum $ 200
         tCum 8 ;
  RETAIN zCum tCum ;
  IF FIRST.y THEN CALL MISSING(zCum, tCum) ;
  zCum=CATX(",",zCum,z) ;
  tCum=SUM(tCum,t) ;
  IF LAST.y THEN OUTPUT ;
RUN ;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/08/2011, 20h38   #4
Invité de passage
 
Homme Blaire Bailli
Étudiant
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Blaire Bailli
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : août 2011
Messages : 7
Points : 3
Points : 3
Par défaut merci

Salut Olivier, tu es un as!
Un gros merci, tu viens de me sauver du temps , tes deux solutions roulent, les deux programmes sont parfaits pour moi
à plus
bailliblaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h39.


 
 
 
 
Partenaires

Hébergement Web