前几天看到一个群友(QQ群:144839730)提的一个问题,根据数据集中的某一个变量的值将一人大数据集拆分为多个小数据集(见上图第15题),实现这一目的的方法有多种,最常见的方法应该是宏循环,下面以根据变量SEX来拆分数据集SASHELP.CLASS为例介绍其他几种方法:
- CALL EXECUTE,程序如下:
proc sql; create table sex as select distinct SEX from sashelp.class ; quit; data _null_; set sex; call execute('data sex_'||cats(SEX)||'(where=(SEX='||quote(cats(SEX))||')); set sashelp.class; run;'); run;
- FILENAME,程序如下:
proc sql; create table sex as select distinct SEX from sashelp.class ; quit; filename code temp; data _null_; file code; set sex; put ' sex_' SEX '(where=(SEX="' SEX '"))' @@; run; data %inc code;; set sashelp.class; run;
- HASH,程序(SAS9.2+)如下:
proc sort data=sashelp.class out=class; by SEX; run; data _null_; dcl hash h(multidata:'y'); h.definekey('SEX'); h.definedone(); do until(last.SEX); set class; by SEX; h.add(); end; h.output(dataset:cats('sex_', SEX)); run;
上面几种方法中第一种方法程序行数最少,第二种方法行数最多,但是我们可以看到第一、第三种方法有多次SET的操作,所以当要拆分的数据集较大时建议用第二种方法以提高效率。