我有两个数据集需要合并。
第一个是一个大数据集,其中 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
希望很清楚。提前致谢。
简
答案 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;