我有一个巨大的数据集包含个人,其中有些有多个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看起来应该很简单,但是还有其他的方法可以用来处理吗?我还尝试将数据转换为宽格式,将所有由逗号和索引分隔的代码连接起来,但是这种方法很麻烦,而且不太动态。我很欣赏你的洞察力!
发布于 2016-06-28 16:24:06
因为同一个人可能有将他们放入多个组的代码,所以您需要独立地定义每个组。为每个队列创建一个单独的变量。您可以在PROC SQL中使用MAX()聚合函数。但这是我如何在数据步骤中使用陶氏技术来实现的。
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;发布于 2016-06-28 15:20:39
您可以在proc步骤中很容易地做到这一点。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;https://stackoverflow.com/questions/38079526
复制相似问题