- data balances;
- input custid $ bal1 bal2 bal3 bal4 bal5 bal6;
- datalines;
- 12345 911.00 863.30 896.98 1672.26 1675.20 602.42
- 12346 62.27 10.28 1377.79 1683.42 1290.92 553.13
- 12347 1996.54 74.68 253.94 374.02 691.90 593.75
- 12348 1494.83 1114.74 332.76 505.95 . 963.98
- 12349 336.61 295.78 335.5 1965.40 592.76 664.7
- ;
- run;
- /*(1)采用data步中的min或smallest是以某一条观测为基础,寻找该观测的不同变量间取值最小的那个,而不是找某一个变量在所有观测中的最小值*/
- data balances2;
- set balances;
- minbal=min(of bal1-bal6); /*获取每个观测bal1-bal6中的最小值*/
- large1=smallest(2,of bal1-bal6); /*获取每个观测bal1-bal6中的第二个最小值*/
- large2=smallest(3,of bal1-bal6); /*获取每个观测bal1-bal6中的第三个最大值*/
- put maxbal large1 large2;
- run;
- /*但是使用proc transpose转置一下,再用相同函数可以得到每个变量的最小值,不过这种办法有点曲线救国了*/
- proc transpose data=balances out=trans name=Test prefix=sn;
- id custid;
- run;
- data balances3;
- set trans;
- minbal=min(of sn12345-sn12349); /*获取变量bal1-bal6中的最小值*/
- put minbal;
- run;
- /*(2)采用SQL寻找某一个变量在所有观测中的最小值应该是最高效的方法*/
- proc sql;
- create table min1 as
- select min(bal1) as min_bal1
- from balances
- ;
- quit;
- proc print data=min1; var min_bal1; run;
- /*采用SQL在处理该问题的明显优势在于:可以同时定位该变量最小值所在的记录,这在数据清理中查询“异常值”非常有帮助*/
- proc sql;
- create table min1 as
- select custid, bal1
- from balances
- having bal1 = min(bal1)
- ;
- quit;
- proc print data=min1; run;
- /*(3)采用proc summary, proc univariate 也是另外一种寻找某一个变量最小值的可选的办法*/
- proc summary data=balances;
- var bal1;
- output out=sum1 min=min_bal1;
- run;
- proc print data=sum1;run;
- proc univariate data=balances;
- var bal1;
- output out=sum1 min=min_bal1;
- run;
- proc print data=sum1;run;
- /*proc univariate 同时还有另外一个特别的选项,nextrods, 可以同时输出多个最大最小的观测值,并输出相应的ID号,这对数据清理中发现异常值非常重要*/
- proc univariate data=balances nextrods=3;
- id custid;
- var bal1;
- run;
- /*(4)采用proc tabulate 也是另外一种备选的办法*/
- proc tabulate data=balances;
- var bal1;
- table bal1*(mean std min max median);
- keylabel mean='均值' std='标准差' min='最小值' max='最大值' median='中位数';
- run;
- /*(5)如果熟悉矩阵的话,当然也是可以采用的*/