根据变量值拆分SAS数据集

Splitting

前几天看到一个群友(QQ群:144839730)提的一个问题,根据数据集中的某一个变量的值将一人大数据集拆分为多个小数据集(见上图第15题),实现这一目的的方法有多种,最常见的方法应该是宏循环,下面以根据变量SEX来拆分数据集SASHELP.CLASS为例介绍其他几种方法:

  1. 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;
    
  2. 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;
    
  3. 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的操作,所以当要拆分的数据集较大时建议用第二种方法以提高效率。

曾宪华 /
本文采用 署名-非商业性使用-相同方式共享 3.0许可协议 属于 程序人生 分类, 被贴了 CALL EXECUTE FILENAME Hash Object 书签

上一篇 用DM语句设置SAS环境
下一篇 批量改变SAS数据集字符型变量的长度