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 22/01/2008, 11h00   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 49
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 49
Points : 11
Points : 11
Par défaut Creation tableau avec array

bonjour à tous!
en pj voici une vue de ma table.
Celle ci est composé d'une variable Ident l'identifiant , d'un code ape qui va avec (pas très importante). aussi, un nombre de salariés, et une masse salariale pour chaque trimestre de chaque année de 2000 à 2005. Il ya autant de fois de lignes de ident que de déclarations trimestrielles.
Ce que je veux c'est créer une nouvelle table avec le "array et retain" qui me donne en gros ceci:
APE CODE/ Ident/ Masse_sal_2000T1/ Masse_sal_2000T2/..../Masse_sal_20005T4/effectif_2000T1/effectif_2000T2/.../effectif_2005T4

soit en tout 50 colonnes je crois pour les 50 variables: 6 années * 4trimestres mais pour les deux variables eff et sal d'ou 48+ape code et ident.

Voilà le problème et je n'arrive pas à le résoudre!
si quelqu'un a une idée, merci!
Fichiers attachés
Type de fichier : doc Nouveau Document Microsoft Office Word.doc (86,0 Ko, 17 affichages)
Vascogil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2008, 12h12   #2
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Bonjour,

Tu peux passer par 2 proc transpose et un merge

pour cela créé une variable annee_trimestre et fais une proc transpose par APE et Ident :

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 ta_table;
   format annee_trimestre $10.;
   SET ta_table;
   annee_trimestre=trim(LEFT(annee))||"T"||trim(LEFT(trimestre));
run;
 
proc sort DATA=ta_table;
   BY ape ident annee_trimestre;
run;
 
proc transpose DATA=ta_table out=masse_sal prefix=Masse_sal_;
   BY ape ident;
   var masse_sal;
   id annee_trimestre;
run;
 
proc transpose DATA=ta_table out= effectif prefix=effectif_;
   BY ape ident;
   var effectif;
   id annee_trimestre;
run;
 
DATA ta_table_final;
   merge masse_sal effectif;
  BY ape ident;
run;
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2008, 18h09   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 49
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 49
Points : 11
Points : 11
Merci pour ta solution!!!!!!!
C'est ce que j'ai fait!
PROBLEME: il faut que je le fasse avec ARRAY et RETAIN mais je n'y comprends rien!
En tout cas cette solution c'est ma roue de secours!
sinon voici sur quoie je dois m'aider (exemple):
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
DATA MANYPER;
	input ID TIME SCORE;
	datalines;
01	1	3
01	2	4
01	3	5
02	1	7
02	3	9
03	1	6
03	2	5
03	3	4
;
run;
proc sort DATA=MANYPER; BY ID TIME; run;
DATA ONEPER_REC;
	array S[3] S1-S3;
	retain S1-S3;
	SET MANYPER;
	BY ID;
	IF first.id then do i=1 TO 3; 
		S[I] =.; 
	end;
	S[TIME]=SCORE;
	IF last.id then output;
	keep id S1-S3;
run;
Et essayer de faire la même chose dans mon cas...
bref je suis pas sorti de l'auberge!
Vascogil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 11h18   #4
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
re,

voici la solution l'idée est de faire 2 tableaux (pour masse_sal et effectif) à 2 dimensions : année, trimestre.

Attention : mon exemple ne marche que si tu as des années >= à 2001.
j'ai fait pour masse_sal pour année 2001 et 2002, il faut que tu complète le code avec les autres années.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
proc sort DATA=ta_table;
	BY APE IDENT annee trimestre;
run;
 
DATA table_finale;
             /*tableau masse_sal avec 2 dimensions : année, trimestre 
             ici on a 2 années 2001 et 2002, à mettre à jour*/
	array masse{2,4}  MASSE_SAL_2001T1-MASSE_SAL_2001T4 
		             MASSE_SAL_2002T1-MASSE_SAL_2002T4
	;
	retain masse ;
	SET ta_table;
	BY  APE IDENT ;
	masse(annee-2000,trimestre)=masse_sal;
	IF NOT last.ident then DELETE;
run;
Steel
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2008, 20h55   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 49
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 49
Points : 11
Points : 11
J'ai trouvé la solution:
Si jamais cela peut aider quelqu'un!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATA projet.etablissements5;
	array salary[24] salary1-salary24; 
	array staff[24] staff1-staff24; 
	retain salary1-salary24
		   staff1-staff24;
	SET projet.etablissements4;
	BY ident;
	IF first.ident then do i=1 TO 24;
		salary[i]=.;
		staff[i]=.;
	end;
	salary[periode]=Masse_sal;
	staff[periode]=Effectif;
	IF last.ident then output;
	keep ident APE salary1-salary24 staff1-staff24;
run;
Vascogil 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 06h00.


 
 
 
 
Partenaires

Hébergement Web