Le forum du Master ESA économétrie et statistique appliquée - Université d'Orléans

Vous n'êtes pas identifié.

Annonce

Vous êtes sur le forum du master ESA !

Le site du master ESA - description de la formation, notes de cours, contacts... est ici :

http://www.univ-orleans.fr/deg/masters/ESA/

#1 14-04-2008 20:25:11

alaa-eddine
Member
Date d'inscription: 07-03-2007
Messages: 398

Pour les allergiques au Merge…

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),

Code:

 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)

Code:

                   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 :

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)


Code:

proc format cntlin=c;
RUN;

Je crée le format à partir de la table c.

Code:

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 :

Code:

             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

 

#2 23-04-2008 12:48:45

esa_sr
Administrator
Date d'inscription: 21-02-2007
Messages: 5069
Site web

Re: Pour les allergiques au Merge…

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 :

Code:

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

 

Pied de page des forums

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson