首页 > 解决方案 > 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
;

在上面你会发现三个数据集。

  1. 分数数据集根据低列和高列之间的值范围描述每个变量的分数。

  2. 第二个数据集main_data显示了 Debt 和 MAX_NA 的确切值。

  3. end_result表是我想要实现的。

我应该使用哪些步骤和语句来计算分数并获取 end_result 表?

标签: sasdatastep

解决方案


另一种方法是使用双左连接,如下所示:

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 

推荐阅读