我的数据结构如下:
ID admission discharge loc_num lagdish
A 08Oct15 12Oct15 0001 -
A 13Oct15 21Oct15 0002 12Oct15
A 12Nov15 16Nov15 0003 21Oct15
A 01Dec15 03Dec15 0004 16Nov15
B 03Aug15 08Aug15 0001 03Dec15
B 03Aug15 08Aug15 0007 08Aug15
C 14Sep15 17Sep15 0003 08Aug15
C 17Sep15 17Sep15 0003 17Sep15
规则是,如果当前入场和之前的出院时间相隔1天或更短,则应将其汇总为一集,但前提是loc_num相同。如果loc_num不同,它仍将被视为两集。有些ID具有相同的录取和放电,但是不同的loc_nums,这应该被认为是一集(所以相同的标志)。
理想情况下,标记的表格如下所示:
ID admission discharge loc_num lagdish flag
A 08Oct15 12Oct15 0001 - 1
A 13Oct15 21Oct15 0002 12Oct15 2
A 12Nov15 16Nov15 0003 21Oct15 3
A 01Dec15 03Dec15 0004 16Nov15 4
B 03Aug15 08Aug15 0001 03Dec15 1
B 03Aug15 08Aug15 0007 08Aug15 1
C 14Sep15 17Sep15 0003 08Aug15 1
C 17Sep15 17Sep15 0003 17Sep15 1
因此对于ID A,尽管12Oct15到13Oct15之间的差异是1天,但loc_num是不同的,因此它们是不同的剧集。对于ID C,因为差异是0天且loc_num是相同的,所以它被认为是相同的剧集。
proc sort data=have; by ID admission; run;
data want;
set have;
flag=1;
do until (last.ID);
set have_orig;
by ID admission;
lagdisch=lag(discharge);
if first.id=0 then do;
if admission > lagdisch+1 then admission+1;
else admission+0;
end;
output;
end;
run;
我使用此标记来合并剧集而不考虑loc_num,因此它会标记在当前录取和先前放电之间相隔1天或更短的ID内的任何剧集。但我还没弄清楚如何修改它,以便考虑稍微不同的规则来设置标志。
增加:
ID admission discharge loc_num lagdish
F 10Apr15 14Apr15 0003 -
G 30Apr15 30Apr15 0002 14Apr15
G 01May15 06May15 0002 30Apr15
G 08Sep15 12Sep15 0002 06May15
答案 0 :(得分:1)
我已经测试了不同的条件。试试这个,如果您在理解代码的任何部分时遇到任何困难,请告诉我。
data have;
input id $ admission date9. discharge date9. loc_num 5. lagdish date9.@;
format admission date9. discharge date9. lagdish date9.;
cards;
a 08oct15 12oct15 0001 -
a 13oct15 21oct15 0002 12oct15
a 12nov15 16nov15 0003 21oct15
a 01dec15 03dec15 0004 16nov15
a 01dec15 03dec15 0005 03dec15
b 03aug15 08aug15 0001 03dec15
b 03aug15 08aug15 0007 08aug15
c 14sep15 17sep15 0003 08aug15
c 17sep15 17sep15 0003 17sep15
d 17sep15 17sep15 0003 17sep15
d 18sep15 19sep15 0004 17sep15
e 17sep15 17sep15 0004 19sep15
e 18sep15 19sep15 0004 17sep15
f 10apr15 14apr15 0003 -
g 30apr15 30apr15 0002 14apr15
g 01may15 6may15 0002 30apr15
g 08sep15 12sep15 0002 06may15
g 15sep15 16sep15 0002 06may15
;
run;
data have1(drop=lagdish lag_adm lag_dis lag_loc);
set have;
format lag_adm date9. lag_dis date9.;
by id;
lag_adm = lag(admission);
lag_dis = lag(discharge);
lag_loc = lag(loc_num);
if first.id then
do;
lag_adm = .;
lag_dis = .;
lag_loc = .;
end;
if intck("days",admission,lag_dis) in (-1,0,1) and loc_num = lag_loc then
flag=1;
if admission = lag_adm and discharge=lag_dis then
flag = 1;
run;
proc sort data= have1 out=have2;
by descending id descending admission descending flag;
run;
data have3;
set have2;
by descending id;
lag_flag=lag(flag);
if first.id then
lag_flag=.;
flag1 = compress(flag||lag_flag,'. ');
run;
proc sort data=have3 out=have4(drop=lag_flag flag);
by id admission flag;
run;
data want1;
set have4(where=(flag1='1'));
indicator=1;
run;
data want2;
set have4(where=(flag1 not ='1'));
by id;
if first.id then
indicator=1;
indicator+1;
run;
data want(drop=flag1);
set want1 want2;
run;
proc sort data=want;
by id admission;
run;
我的输出:
ID admission discharge loc_num INDICATOR
A 08Oct2015 12Oct2015 1 2
A 13Oct2015 21Oct2015 2 3
A 12Nov2015 16Nov2015 3 4
A 01Dec2015 03Dec2015 4 1
A 01Dec2015 03Dec2015 5 1
B 03Aug2015 08Aug2015 1 1
B 03Aug2015 08Aug2015 7 1
C 14Sep2015 17Sep2015 3 1
C 17Sep2015 17Sep2015 3 1
D 17Sep2015 17Sep2015 3 2
D 18Sep2015 19Sep2015 4 3
E 17Sep2015 17Sep2015 4 1
E 18Sep2015 19Sep2015 4 1
F 10Apr2015 14Apr2015 3 2
G 30Apr2015 30Apr2015 2 1
G 01May2015 06May2015 2 1
G 08Sep2015 12Sep2015 2 2
G 15Sep2015 16Sep2015 2 3