首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS按组处理:为整个组分配值

SAS按组处理:为整个组分配值
EN

Stack Overflow用户
提问于 2016-06-28 14:51:02
回答 2查看 82关注 0票数 0

我有一个巨大的数据集包含个人,其中有些有多个ICD-9代码过程.我需要创建几个队列,这取决于这些个人拥有的ICD-9代码,但是我的副处理并不是我想要的。

下面是一个示例数据集:

代码语言:javascript
复制
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应该是另一个,因为虚拟代码。

下面的代码不像我所打算的那样通过处理来完成:

代码语言:javascript
复制
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

我希望它看起来是这样的:

代码语言:javascript
复制
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

看起来应该很简单,但是还有其他的方法可以用来处理吗?我还尝试将数据转换为宽格式,将所有由逗号和索引分隔的代码连接起来,但是这种方法很麻烦,而且不太动态。我很欣赏你的洞察力!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-28 16:24:06

因为同一个人可能有将他们放入多个组的代码,所以您需要独立地定义每个组。为每个队列创建一个单独的变量。您可以在PROC SQL中使用MAX()聚合函数。但这是我如何在数据步骤中使用陶氏技术来实现的。

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2016-06-28 15:20:39

您可以在proc步骤中很容易地做到这一点。case when语句确定每一行的队列,就像您在数据步骤中所做的那样,而maxgroup by结合则查找每个id的case when语句的最大值。因此,如果给定id的所有行的cohort_pre值为1,则最大为1;否则将得到更高的队列。

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38079526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档