
Vous n'êtes pas identifié.
Vous êtes sur le forum du master ESA !
Le site du master ESA - description de la formation, notes de cours, contacts... vient de déménager !!!
Venez visiter notre nouveau site : www.master-esa.fr
Une petite astuce bien sympathique, pour éviter ce maudit « proc sort » puis le « data ; merge ; »
Plutôt que de merger 2 base pour récupérer l’information, on transforme cette information en format sas (qui peut être stocké de façon permanente !)
Exemple:
Prenons le fichier « maps.france2 » où figurent les noms des départements (IDNAME),
Obs _MAP_GEOMETRY_ ID COUNTRY IDNAME REGION REGIONID 1 id 1 of maps.france 1 350 AIN RHONE-ALPES 5946 2 id 2 of maps.france 2 350 AISNE PICARDIE 772 3 id 3 of maps.france 3 350 ALLIER AUVERGNE 891
Et le fichier « maps.france » où je ne dispose pas de cette information, mais que les numéros des départements (ID)
Obs SEGMENT X Y LAT LONG ID
1 1 488.000 347.486 0.80676 -0.10169 1
2 1 493.000 350.154 0.80739 -0.10368 1
3 1 494.000 352.823 0.80810 -0.10415 1
4 1 494.000 355.490 0.80882 -0.10423 1
...
72 1 351.500 587.610 0.87419 -0.052849 2
73 1 357.000 587.610 0.87413 -0.055126 2
74 1 361.000 588.944 0.87445 -0.056805 2
75 1 365.000 588.944 0.87441 -0.058462 2Le code :
data c(keep=start label fmtname type); set maps.france2 ;
rename id=start
IDNAME=label ;
fmtname="dep" ;/*nom du format*/
type="N";/*pour les numerics*/
run;Je crée une table dans la quelle je stocke de format.(il ne faut pas modifier ces variables : start label fmtname type)
proc format cntlin=c; RUN;
Je crée le format à partir de la table c.
data france ; set maps.france ; depname=put(id, $dep.); run;
Et hop ! je l’applique à ma table final (je crée une nouvelle variable depname avec un « put »)
Resultat :
Obs SEGMENT X Y LAT LONG ID depname
1 1 488.000 347.486 0.80676 -0.10169 1 AIN
2 1 493.000 350.154 0.80739 -0.10368 1 AIN
3 1 494.000 352.823 0.80810 -0.10415 1 AIN
4 1 494.000 355.490 0.80882 -0.10423 1 AIN
5 1 496.000 358.158 0.80951 -0.10508 1 AINSuper pratique lorsqu’on se coltine des tables de 10Go tout les jours !
Note : vous pouvez même supprimer la table work.c si elle prend trop de place sur le DD !
Hors ligne
rigolo mais c'est une alternative au merge uniquement parce que vous avez une variable dans une table qui est codée doublement mais qui dans une seconde table n'est saisie qu'une fois.
ensuite pour gagner du temps dans vos phases de tri, vous avez l'option TAGSORT :
Option à privilegier si vous avez une table de très grande taille à trier – SAS ne trie dans ce cas que les clés de tri et le numéro de l’observation – il réunira ce pré-tri aux autres données ensuite. Cette option ne vous fait pas forcément gagner du temps mais elle économise de la place sur le disque dur.
sinon, vous pouviez faire encore plus amusant :
data dep1;
infile cards dlm='#';
input depnum $ deplet $23.;
cards;
1#Ain
2#Aisne
3#Allier
4#Alpes-de-Haute-Provence
5#Hautes-Alpes
6#Alpes-Maritimes
7#Ardèche
8#Ardennes
9#Ariège
10#Aube
11#Aude
12#Aveyron
13#Bouches-du-Rhône
14#Calvados
15#Cantal
16#Charente
17#Charente-Maritime
18#Cher
19#Corrèze
2A#Corse-du-Sud
2B#Haute-Corse
21#Côte-d'Or
22#Côtes
23#Creuse
24#Dordogne
25#Doubs
26#Drôme
27#Eure
28#Eure-et-Loir
29#Finistère
30#Gard
31#Haute-Garonne
32#Gers
33#Gironde
34#Hérault
35#Ille-et-Vilaine
36#Indre
37#Indre-et-Loire
38#Isère
39#Jura
40#Landes
41#Loir-et-Cher
42#Loire
43#Haute-Loire
44#Loire-Atlantique
45#Loiret
46#Lot
47#Lot-et-Garonne
48#Lozère
49#Maine-et-Loire
50#Manche
51#Marne
52#Haute-Marne
53#Mayenne
54#Meurthe-et-Moselle
55#Meuse
56#Morbihan
57#Moselle
58#Nièvre
59#Nord
60#Oise
61#Orne
62#Pas-de-Calais
63#Puy-de-Dôme
64#Pyrénées-Atlantiques
65#Hautes-Pyrénées
66#Pyrénées-Orientales
67#Bas-Rhin
68#Haut-Rhin
69#Rhône
70#Haute-Saône
71#Saône-et-Loire
72#Sarthe
73#Savoie
74#Haute-Savoie
75#Paris
76#Seine-Maritime
77#Seine-et-Marne
78#Yvelines
79#Deux-Sèvres
80#Somme
81#Tarn
82#Tarn-et-Garonne
83#Var
84#Vaucluse
85#Vendée
86#Vienne
87#Haute-Vienne
88#Vosges
89#Yonne
90#Terr.de Belfort
91#Essonne
92#Hauts-de-Seine
93#Seine-St-Denis
94#Val-de-Marne
95#Val-D'Oise
;
data dep2(drop=i toto);set dep1 (keep=depnum);
toto=floor(ranuni(23)*5);
do i=1 to toto;
output;
end;
run;
** la boucle sur toto n'est là que pour créer un table de dimension différente de celle de la table de départ (trop facile sinon... ;
data _null_;set dep1;
call symput (compress('dep'||depnum),deplet);
run;
data dep2;set dep2;
Z=SYMGET('dep'!!LEFT(PUT(depnum,2.))) ;
run;
proc print;run;amusez vous à le faire tourner.
Avec vos tables, vous partez de la table MAPS.france2 de laquelle vous ne gardez que ID et IDNAME puis vous créez vos macro variables avec le CALL SYMPUT.
amusant ?
cordialement
SR
Hors ligne