Слияние наборов данных на основе 2 переменных в SAS - PullRequest
0 голосов
/ 15 марта 2010

Я работаю с разными базами данных. Все они содержат информацию о 1000+ компаний. Компания определяется ее кодом тикера (краткая версия названия (то есть Ford как F), обычно видимая на биржевых котировках).

Помимо кода тикера для слияния, мне также нужно слить по времени. Я использовал месяц как переменную подсчета на протяжении всего своего временного ряда. Конечная цель состоит в том, чтобы иметь регрессию в виде

Y(jt) = c + X(jt) +X1(jt) и т. Д. С j = company (тикер) и t = time (месяц).

Итак, представьте, что у меня есть 2 базы данных, одна из которых является базовой базой данных с такими переменными, как тикеры, месяцы, бета-версии компании (мера риска) и т. Д., А вторая база данных имеет дополнительную переменную (скажем, рыночная капитализация). ,

Затем я хочу объединить эти две базы данных на основе тикера и месяца.

Пример: базовая база данных:

Ticker ____ Month ____ Betas

AA ____ 4 ____ 1.2

BB ____ 8 ____ 1.18

Вторая база данных:

Ticker ____ Month ____ MCAP

AA ____ 4 ____ 8542

BB ____ 6 ____ 1245

Тогда после слияния я бы хотел что-то вроде этого:

Ticker ____ Month ____ Betas ____ MCAP

AA ____ 4 ____ 1.2 ____ 8542

Таким образом, все наблюдения, которые не соответствуют ОБА дате и тикеру, должны быть отброшены. Я уверен, что это возможно, просто не могу найти правильный тип кода.

PS: Полагаю, подчеркивания имеют какое-то отношение к макету шрифта, но оба шрифта, выделенные жирным шрифтом и курсивом, должны быть нормальными:)

Ответы [ 4 ]

3 голосов
/ 16 марта 2010

Согласитесь с Джонатаном ... после независимой сортировки обоих наборов данных по тикеру и времени я бы использовал шаг слияния данных ..... небольшая модификация

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

Записи, которые не имеют общего тикера и времени в обоих наборах данных, будут автоматически отбрасываться.

1 голос
/ 15 марта 2010

Вызов двух наборов данных base и mcap и предположив, что они отсортированы по тикеру и месяцу, вы можете сделать это следующим образом:

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

Подмножество if не будет принимать ни одну строку, не совпадающую в наборах данных ванны.

0 голосов
/ 18 мая 2012
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;
0 голосов
/ 15 марта 2010

Хорошо, похоже, вы можете просто сделать это очень просто:

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;

Это код, который я использовал, я попробовал это перед публикацией, потому что я не хотел выглядеть как распутник, но так получилось, что две базы данных, которые я попробовал, не имели ничего общего (каковы шансы на 70.000 наблюдений: D) Я повторил попытку, и она работает (пока!)

В любом случае, спасибо!

...