我有一个包含个人的庞大数据集,其中一些人有多个ICD-9代码程序。我需要根据这些人拥有的ICD-9代码创建一些同类群组,但我的处理方式不符合我的意图。
以下是一个示例数据集:
DATA TEST;
INPUT ID: $5. CODE;
FORMAT CODE Z4.;
DATALINES;
A 8006
A 8155
A 0080
A 0081
A 0082
A 0083
A 0084
B 8006
B 8155
B 0080
B 0081
B 0082
B 0083
B 0084
B 9999
;
RUN;
主题A和B具有完全相同的代码,除了主题B具有额外的伪代码9999
。在这里,如果主题仅具有代码8006,8155和0080至0084(并且没有别的!),则将它们放入一个群组中。对象A应该是一个群组,由于伪代码,对象B应该是另一个群组。
下面的代码并没有像我想要的那样进行处理:
DATA TEST1; SET TEST;
BY ID;
IF CODE IN (8006,8155,0080:0084) THEN COHORT=1;
ELSE COHORT=2;
RUN;
ID CODE COHORT
A 8006 1
A 8155 1
A 0080 1
A 0081 1
A 0082 1
A 0083 1
A 0084 1
B 8006 1
B 8155 1
B 0080 1
B 0081 1
B 0082 1
B 0083 1
B 0084 1
B 9999 2
我希望它看起来像这样:
ID CODE COHORT
A 8006 1
A 8155 1
A 0080 1
A 0081 1
A 0082 1
A 0083 1
A 0084 1
B 8006 2
B 8155 2
B 0080 2
B 0081 2
B 0082 2
B 0083 2
B 0084 2
B 9999 2
看起来应该很简单,但还有另一种方法可以使用by-processing吗?我还尝试将数据放入宽格式,连接用逗号和索引分隔的所有代码,但这种方法很麻烦而且不是很动态。我很欣赏这种见解!
答案 0 :(得分:2)
由于同一个人可能拥有将它们放在多个组中的代码,因此您需要单独定义每个组。为每个群组创建单独的变量。您可以在PROC SQL中使用MAX()聚合函数。但这是我在数据步骤中使用DOW技术的方法。
data want ;
do until (last.id) ;
set have ;
by id;
if code = '8154' then COHORT1=1;
else if code in ('8006','8155') or '0080' <= code <= '0084' then COHORT2=1;
else if code = '8151' then COHORT3=1;
else if code = '8153' or '0070' <= code <='0073' then COHORT4=1;
else if code = '8156' then COHORT5=1 ;
end;
if N(of COHORT1-COHORT5) > 1 then COHORT=6;
else COHORT=whichn(1,of COHORT1-COHORT5);
drop cohort1-cohort5 ;
run;
答案 1 :(得分:0)
您可以在proc sql步骤中轻松完成此操作。 case when
语句确定每行的同类群组,就像您在数据步骤中所做的那样,max
与group by
相结合,找到每个ID的case when
语句的最大值。因此,如果给定id的所有行的cohort_pre
值都为1,则最大值为1;否则你会得到一个更高的队列。
proc sql;
create table test1 as select distinct
id, code,
case when code = 8154 then 1
when code in(8006,8155,0080:0084) then 2
when code = 8151 then 3
when code in(8153,0070:0073) then 4
when code = 8156 then 5 else 99 end as cohort_pre,
case when count(distinct calculated cohort_pre) = 1 then max(calculated cohort_pre)
else 6 end as cohort
from test
group by id;
quit;