如何设置日期和另一个标识符之间差异的标志?

时间:2017-04-25 18:55:37

标签: sas

我的数据结构如下:

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

1 个答案:

答案 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