несколько слиться? - PullRequest
       8

несколько слиться?

2 голосов
/ 20 марта 2012

Мне нужно объединить два набора данных.

Первый - это большой набор данных с studyid и discharg (дата, когда пациенты получили выписку).

Второе - меньше наблюдений, чем первое. Они имеют два столбца: studyid и call_mad (дата, когда медсестра вызывает пациента после даты выписки ). Не все увольнения получают вызов от медсестры.

Первая таблица

STUDYID   DISCHARG      

10011   2008-10-29          

10011   2008-11-7           

10011   2008-11-18          

10011   2009-10-17     

10011   2010-1-2       

10011   2010-1-22  

Второй стол

 STUDYID        CALL_MAD

 10011          2009-10-19
 10011          2010-1-25  

Финальный стол, который я хочу

STUDYID   DISCHARG      CALL_MAD

10011   2008-10-29          

10011   2008-11-7           

10011   2008-11-18          

10011   2009-10-17      2009-10-19

10011   2010-1-2       

10011   2010-1-22       2010-1-25  

Надеюсь, это понятно. Заранее спасибо.

Jane

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Я не много тестировал, но думаю, что все должно работать нормально. Я не эксперт SAS.

Предполагается, что ваши два набора данных названы 'first' и 'second':

/* set unique identifiers */
data first;
    set first;
    keyida = _N_;
run;

data second;
    set second;
    keyidb = _N_;
run;

Промежуточный взгляд на данные:

Сначала выглядит так:

study   discharg    keyida
10011   10/29/2008  1
10011   11/07/2008  2
10011   11/18/2008  3
10011   10/17/2009  4
10011   01/02/2010  5
10011   01/22/2010  6

Второй выглядит так:

study   discharg    keyidb
10011   10/19/2009  1
10011   01/25/2010  2

Теперь объедините и очистите:

/* merge the data on id and call made after discharge */
proc sql;
    create table final as
    select  a.studyid,
            a.discharg,
            a.keyida,
            b.studyid,
            b.call_mad,
            b.keyidb
    from    first a,
            second b
    where   a.studyid = b.studyid and
            b.call_mad > a.discharg
    order by keyida; 
quit;

/* remove duplicates of original dataset */
proc sort data=final nodupkey;
    by  keyida;
run;

/* sort by secondary id and date of calling */
proc sort data=final;
    by  call_mad
        keyidb;
run;

/* remove duplicates of the secondary dataset */
data final (drop = keyida keyidb);
    set final;
    by  call_mad
        keyidb;
    if not (last.call_mad and last.keyidb) then call_mad =.;
run;

Окончательный набор данных выглядит так:

study   discharg    call_mad
10011   10/29/2008  .
10011   11/07/2008  .
10011   10/17/2009  10/19/2009
10011   11/18/2008  .
10011   01/02/2010  .
10011   01/22/2010  01/25/2010
1 голос
/ 21 марта 2012

У меня была та же идея, что и у themailmail, т.е. вы сначала извлекаете самую последнюю дату DISCHARG, которая <(или, возможно, <=), каждую дату CALL_MAD, а затем объединяете эти данные обратно в исходный набор данных.Я думаю, что это лучшее, что можно сделать с данными, структурированными как есть, хотя существует вероятность того, что эта логика сломается (например, если вызов медсестры не относится к последней выписке).В идеале вы хотели бы добавить столбец даты DISCHARG во вторую таблицу в качестве вторичного ключа, чтобы было легко объединить даты STUDYID и DISCHARG без каких-либо предположений. </p>

В любом случае, здесь код, который я использовал.

data ds1;
input STUDYID DISCHARG :yymmdd10.;
format DISCHARG yymmdd10.;
datalines;
10011   2008-10-29
10011   2008-11-7
10011   2008-11-18
10011   2009-10-17
10011   2010-1-2
10011   2010-1-22
;
run;

data ds2;
input STUDYID CALL_MAD :yymmdd10.;
format CALL_MAD yymmdd10.;
datalines;
10011   2009-10-19
10011   2010-1-25
;
run;

proc sql;
create table ds3 as select
ds1.*,
ds2.call_mad
from ds1 inner join ds2 on ds1.studyid=ds2.studyid and ds2.call_mad>ds1.discharg
group by ds1.studyid,ds2.call_mad
having ds1.discharg=max(ds1.discharg);

create table want as select
ds1.*,
ds3.call_mad
from ds1 left join ds3 on ds1.studyid=ds3.studyid and ds1.discharg=ds3.discharg;
quit;
...