首页 > 解决方案 > SAS从一行计算多个新变量

问题描述

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

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

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

所需的输出表就像

    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,但它自然会跳到下一行来计算何时满足条件。但我想计算每一行的其他满足条件。

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

我的问题是我怎样才能设法一次计算每个 ID 的其他满足条件而不单独计算?输出表的行数将超过预期的输入,但对我来说,通过应用 case-when 或 if 等是不可能实现的。

提前感谢,如果我不清楚,对不起。

标签: sqlsasmultiple-columnscalculated-columns

解决方案


只需使用 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 $1 ERR_DETAIL $20 ERR_ID $10 ;
  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

推荐阅读