SAS从一行中计算多个新变量

SAS computing multiple new variables from one row

我有一个如下所列的数据集:

    ID-----V1-----V2------V3    
    01------5------3-------7
    02------3------8-------5
    03------6------9-------1

我想根据某些列的行为计算 3 个新变量(ERR_CODE、ERR_DETAIL、ERR_ID)。

期望的输出table就像

    ID-----ERR_CODE----ERR_DETAIL---------ERR_ID
    01--------A--------Out of range---------01_A
    01--------C--------Fault----------------01_C
    02--------B--------Check Log------------02_B
    02--------C--------Fault----------------02_C
    03--------A--------Out of range---------03_A
    03--------B--------Check Log------------03_B

我正在使用 SAS 9.3 和 EG 5.1。我已经尝试过 do-loops、数组、if 语句和 case-when,但它自然会跳到下一行来计算何时满足条件。但我想计算每一行的其他满足条件。

我已经设法通过为每个条件创建单独的 table 然后合并它们来做到这一点。但是,如果有很多条件可以使用,那似乎不是一种有效的方法。

我的问题是如何在不单独计算的情况下一次计算每个 ID 的其他满足条件?输出 table 的行数将比预期的多,但对我来说,不可能通过应用 case-when 或 if 等来实现

提前致谢,如果我不清楚,请见谅。

只需使用 IF/THEN/DO 块。添加一个 OUTPUT 语句为每个错误写入新的观察结果。

data have ;
  input ID $ V1-V3;
cards;
01 5 3 7
02 3 8 5
03 6 9 1
;

data want;
  set have;
  length ERR_CODE  ERR_DETAIL  ERR_ID  ;
  if v1>4 then do;
    err_code='A'; err_detail="Out of range"; err_id=catx('_',id,err_code);
    output;
  end;
  if v2>4 then do;
    err_code='B'; err_detail="Fault"; err_id=catx('_',id,err_code);
    output;
  end;
  if v3>4 then do;
    err_code='C'; err_detail="Check Log"; err_id=catx('_',id,err_code);
    output;
  end;
  drop v1-v3 ;
run;

结果:

Obs    ID    ERR_CODE    ERR_DETAIL      ERR_ID

 1     01       A        Out of range     01_A
 2     01       C        Check Log        01_C
 3     02       B        Fault            02_B
 4     02       C        Check Log        02_C
 5     03       A        Out of range     03_A
 6     03       B        Fault            03_B