sql - SAS从一行计算多个新变量
问题描述
我有一个如下所列的数据集:
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 和 ERR_DETAIL = "检查日志" 和 ERR_ID = [ID]_B
- 如果 V3 大于 4,则 ERR_CODE = C 且 ERR_DETAIL = "Fault" 且 ERR_ID = [ID]_C
所需的输出表就像
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 等是不可能实现的。
提前感谢,如果我不清楚,对不起。
解决方案
只需使用 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
推荐阅读
- python - 空白 Seaborn 条形图
- python - 如何在熊猫中连接两个数据框?
- python - 传递参数
- r - 使用 dplyr 进行 quasiquotation 的混合输入
- xml - 在 DataWeave 2.0 中删除 XML 标头声明并提供不带前缀的 XML 命名空间
- c# - 如何让所有视图都可以访问共享的 ProgressCircle 控件?
- azure-resource-manager - 子资源中的正确依赖分配似乎不起作用
- ios - UITableViewCell - 将背景设置为渐变以删除(可滑动操作) - Swift 4.2
- c++ - 使用 boost strand 和 std::mutex
- angular - ag-grid cellrenderer:将html标签添加到单元格但不在模板中,而是作为函数的返回值