little_to_many合并?

时间:2012-03-19 20:25:44

标签: sas

我有两个数据集需要合并。

第一个是一个大数据集,其中 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  

希望很清楚。提前致谢。

2 个答案:

答案 0 :(得分:2)

我没有对此进行过多次测试,但我认为它应该可以正常工作。我不是专家。

它假设您的两个数据集名为“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 :(得分:1)

我和thelatemail有同样的想法,即你首先提取最新的DISCHARG日期< (或可能< =)每个CALL_MAD日期,然后将该数据合并回原始数据集。我认为尽管这种逻辑有可能被打破(例如,如果护士的电话与最近的出院无关),那么这是最好的结构数据。理想情况下,您希望将DISCHARG日期列作为辅助密钥添加到第二个表中,以便在不做任何假设的情况下很容易加入STUDYID和DISCHARG日期。

无论如何,这里是我使用的代码。

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;