sas - SAS:分箱数据
问题描述
data scores;
length variables $ 16;
input variables $ low high score;
datalines;
Debt -10000 1 55
Debt 1 10000 23
MAX_NA -1 1 500
MAX_NA 1 100 -240
;
data main_data;
input ID Debt MAX_NA;
datalines;
222554 7584 12
212552 20 0
883123 500 7
913464 -200 -78
;
data end_result;
input ID Debt MAX_NA score;
datalines;
222554 7584 12 -217
212552 20 0 523
883123 500 7 -185
913464 -200 -78 555
;
在上面你会发现三个数据集。
分数数据集根据低列和高列之间的值范围描述每个变量的分数。
第二个数据集main_data显示了 Debt 和 MAX_NA 的确切值。
end_result表是我想要实现的。
我应该使用哪些步骤和语句来计算分数并获取 end_result 表?
解决方案
另一种方法是使用双左连接,如下所示:
data scores;
length variables $ 16;
input variables $ low high score;
datalines;
Debt -10000 1 55
Debt 1 10000 23
MAX_NA -1 1 500
MAX_NA 1 100 -240
;
data main_data;
input ID Debt MAX_NA;
sortseq = _n_;
datalines;
222554 7584 12
212552 20 0
883123 500 7
913464 -200 -78
;
proc sql;
create table end_result as
select a.ID
,a.Debt
,a.MAX_NA
,coalesce(b.score,0) + coalesce(c.score,0) as score
from main_data as a
left join scores(where=(variables="Debt")) as b
on b.low < a.Debt <= b.high
left join scores(where=(variables="MAX_NA")) as c
on c.low < a.MAX_NA <= c.high
order by a.sortseq
;
quit;
请注意,我在 main_data 中包含了一个 sortseq 变量以保持排序顺序。与 draycut 一样,我为 id 222554 和 883123 获得相同的分数。对于 ID 913464,MAX_NA 值超出了分数数据集的范围,因此我使用合并函数将其计为零。因此,我得到了结果:
ID Debt MAX_NA score
222554 7584 12 -217
212552 20 0 523
883123 500 7 -217
913464 -200 -78 55
推荐阅读
- java - 读取黄瓜中的 .feature 文件并将内容复制到新的功能文件中
- laravel - 如何在 laravel 6 中更新图像
- excel - 当单元格结果按公式更改时运行宏 - 但出现不需要的宏重新触发的问题
- sql - 如何根据 BigQuery 中的另一个现有行为每个用户添加记录?
- java - 如何在sql java android中插入字符串
- c# - 过滤父子集合
- typescript - 扩展接口时出错,(接口属性的)类型与(接口的)类型没有共同的属性
- c# - 如何在 WPF Net5 应用程序中创建单个文件?
- css - 如何在 React 中设置与主页的正文图像不同的样式?
- oracle - 在带有 Oracle 18c 的 Windows 10 上无法读取外部表或使用 utl_file.get_line 读取