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)。
- 如果 V1 大于 4,则 ERR_CODE = A 且 ERR_DETAIL =“超出范围”且 ERR_ID = [ID]_A
- 如果 V2 大于 4 那么 ERR_CODE = B and ERR_DETAIL = "Check Log" and ERR_ID = [ID]_B
- 如果 V3 大于 4,则 ERR_CODE = C 且 ERR_DETAIL =“故障”且 ERR_ID = [ID]_C
期望的输出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
我有一个如下所列的数据集:
ID-----V1-----V2------V3
01------5------3-------7
02------3------8-------5
03------6------9-------1
我想根据某些列的行为计算 3 个新变量(ERR_CODE、ERR_DETAIL、ERR_ID)。
- 如果 V1 大于 4,则 ERR_CODE = A 且 ERR_DETAIL =“超出范围”且 ERR_ID = [ID]_A
- 如果 V2 大于 4 那么 ERR_CODE = B and ERR_DETAIL = "Check Log" and ERR_ID = [ID]_B
- 如果 V3 大于 4,则 ERR_CODE = C 且 ERR_DETAIL =“故障”且 ERR_ID = [ID]_C
期望的输出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