2010-03-15 6 views
0

Je travaille avec différentes bases de données. Tous contiennent des informations sur plus de 1000 entreprises. Une société est définie par son code de téléscripteur (la version courte du nom (c'est-à-dire Ford comme F) généralement vu sur les conseils boursiers). Mis à part le code de téléscripteur à fusionner, je dois aussi fusionner à l'heure. J'ai utilisé le mois comme variable de comptage tout au long de ma série chronologique. Le but final est d'avoir une régression dans le genre deFusion de jeux de données basés sur 2 variables dans SAS

Y(jt) = c + X(jt) +X1(jt) etc avec j = company (ticker) et t = time (mois). Imaginez donc que j'ai 2 bases de données, dont la base de données avec des variables telles que Tickers, mois, betas d'une entreprise (mesure de risque) etc. et une deuxième base de données avec une variable supplémentaire (disons la capitalisation boursière)).

Ce que je veux faire est de fusionner ces 2 bases de données en fonction du ticker et du mois.

Exemple: base de données de base:

 
Ticker ____ Month ____ Betas 

AA ____ 4 ____ 1.2 

BB ____ 8 ____ 1.18 

seconde base de données:

 
Ticker ____ Month ____ MCAP 

AA ____ 4 ____ 8542 

BB ____ 6 ____ 1245 

Puis, après fusion, je voudrais avoir quelque chose comme ceci:

 
Ticker ____ Month ____ Betas ____ MCAP 

AA ____ 4 ____ 1.2 ____ 8542 

Donc toutes les observations qui font ne correspond pas à la date et le ticker doivent être supprimés. Je suis sûr que c'est possible, mais je ne trouve pas le bon type de code.

PS: Je devine que les underscores ont quelque chose à voir avec la mise en page de la police, mais aussi le gras en italique est censé être normal :)

Répondre

3

D'accord avec Jonathan ... après le tri deux ensembles de données indépendamment par téléscripteur et le temps, l'étape de fusion des données est ce que j'utiliser ..... peu de modifications

data want; 
    merge base(in = b) mcap(in = m); 
    by ticker time; 
    if m & b; 
run; 

Les documents qui n'ont pas Le ticker commun et l'heure dans les deux jeux de données seraient automatiquement supprimés.

0

Ok, donc il semble que vous pouvez simplement le faire très facilement par:

proc sort data=work; 
by ticker month; 
run; 
proc sort data=wsize; 
by ticker month; 
run; 
data test; 
merge work(in=a) wsize(in=b); 
by ticker month; 
frommerg=a; 
fromwtvol=b; 
run; 
data test; 
set test; 
if frommerg=0 then delete; 
run; 
data test; 
set test; 
if fromwtvol = 0 then delete; 
run; 
data test; 
set test; 
drop frommerg fromwtvol; 
run; 

C'est le code je, j'ai essayé cela avant de poster parce que je ne voulais pas ressembler à un leecher, mais il se trouve que les 2 bases de données i essayées avaient rien en commun (quelles sont les chances avec 70.000 observations : D), je l'ai réessayé et ça marche (pour l'instant!)

Merci quand même!

+0

Vous pouvez réécrire cela en une seule étape proc sql. Proc sql peut gérer plusieurs à plusieurs fusions, ce que l'étape de données ne peut pas faire, et vous n'avez pas besoin de trier les ensembles de données avant de les fusionner. –

1

appel des deux ensembles de données de base et MCAP, et en supposant qu'ils ont tous deux été triés par téléscripteur et par mois, vous pouvez le faire de cette façon:

data want; 
    merge base(in = b) 
     mcap(in = m); 
    if m & b; 
run; 

Le subsetting si n'acceptera aucune ligne qui ne correspondre dans les jeux de données de bain.

0
proc sort data=database1; 
by ticker month; 
run; 

proc sort data=database2; 
by ticker month; 
run; 
data gh; 
merge database1(in=a) database2(in=b); 
by ticker month; 
if a and b; 
run;