SAS By-Group Processing:为整个组分配值

时间:2016-06-28 14:51:02

标签: sas grouping

我有一个包含个人的庞大数据集,其中一些人有多个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吗?我还尝试将数据放入宽格式,连接用逗号和索引分隔的所有代码,但这种方法很麻烦而且不是很动态。我很欣赏这种见解!

2 个答案:

答案 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语句确定每行的同类群组,就像您在数据步骤中所做的那样,maxgroup 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;