需要计算SAS中的列总数并将其用作计算另一列的输入

时间:2016-09-06 18:01:26

标签: sas

Data IV_SAS;
   set IV;
   Total_Loans=Goods+Bads;
   Dist_Loans=Total_Loans/sum(Total_Loans));
   Dist_Goods=Goods/Sum(Goods);
   Dist_Bads=Bads/Sum(Bads);
   Difference=Dist_Goods-Dist_Bads;
   WOE=log10(Dist_goods/Dist_Bads);
   IV=WOE*Difference;
run;

我在计算(总贷款)总和,计算行总数而不是列总数方面存在问题。

2 个答案:

答案 0 :(得分:0)

Base SAS的工作原理 - 它在数据步骤中的行级操作。

您可能希望使用PROC MEANSPROC TABULATE或类似的proc并在那里找到列总数,然后将其合并(或在其他方法中合并)。

例如:

proc means data=sashelp.class;
  var age height weight;
  output out=class_means sum(age)=age_sum sum(height)=height_sum sum(weight)=weight_Sum;
run;

data class;
  if _n_=1 then set class_means;
  set sashelp.class;
  age_prop = age/age_sum;
  height_prop = height/height_sum;
  weight_prop = weight/weight_Sum;
run;

或者,使用SAS/IMLPROC SQL,当内联问题时,这两者都将在列级别上运行(尽管我认为上述解决方案在速度上可能优于两者,因为开销较低)。

答案 1 :(得分:0)

    data a;
   input goods  bads;
   datalines;
36945   33337
23820   21761
26990   24647
33195   30299
43755   39014
46100   41100
89765   79978
25940   23508
35940   32506
31840   28846
33430   30366
34480   31388
36640   33129
39640   35992
42490   38325
44240   40075
42840   38840
49690   44936
69190   64740
;
run;

proc sql;
create table b as 
      select goods,bads,
            sum(goods,bads) as Total_Loans format=dollar10.,
            sum(goods)as Column_goods_tot format=dollar10. ,
             sum(bads) as Column_bads_tot format=dollar10. ,
             sum(calculated Column_goods_tot, calculated Column_bads_tot) as Column_Total_Loans format=dollar10. ,
        (calculated Total_Loans/calculated Column_Total_Loans) as Dist_Loans 
/*add more code to calculate Dist_Goods, Dist_Bads, etc..*/
      from a;
quit;


/*Column totals only*/
proc sql;
create table c as 

            select 
            sum(goods)as Column_goods_tot format=dollar10. ,
             sum(bads) as Column_bads_tot format=dollar10. ,
             sum(calculated Column_goods_tot, calculated Column_bads_tot) as Column_Total_Loans format=dollar12. 

      from a;
quit;