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 2
Le 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 AIN
Super 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