标题: 练手系列5:多数据集输出 [打印本页] 作者: shiyiming 时间: 2008-7-15 17:13 标题: 练手系列5:多数据集输出 以sashelp.class为例,我想要将源数据集按照某个变量的值拆分成多个数据集。通常的做法是:
[code:dc4f9ne7]data out_m out_f;
set sashelp.class;
if sex='M' then output out_m;
else if sex='F' then output out_f;
run;[/code:dc4f9ne7]
[b:dc4f9ne7]要求:不知道sex会有多少distinct的值就没法在data step值实现定义输出数据集,那怎么灵活实现?
任何方法都可以[/b:dc4f9ne7]作者: shiyiming 时间: 2008-7-15 17:15 标题: 自己先来抛砖引玉 不成熟的hash方法实现的原型程序,供大家参考
[code:1ms6u6yi]%macro create_multiple_outputs(
source_table=,
by_var=,
output_var=,
output_table_prefix=
);
proc sort data=&source_table out=sorted;
by &by_var;
run;
data _null_ ;
declare hash h();
h.definekey ("&by_var", "&output_var");
h.definedata("&by_var", "&output_var");
h.definedone();
do until (last.&by_var);
set sorted;
by &by_var;
h.add();
end;
h.output (dataset:"&output_table_prefix"||&by_var) ;
run ;
%mend create_multiple_outputs;
%create_multiple_outputs(
source_table=sashelp.class,
by_var=sex,
output_var=name,
output_table_prefix=out_
);[/code:1ms6u6yi]作者: shiyiming 时间: 2008-7-15 21:26 标题: Re: 练手系列5:多数据集输出 先发下我的,使用宏实现,如有不足,请各位指正。
%macro out_table(input_table=,by_var=);
proc sort data=&input_table;
by &by_var;
run;
data a;
set &input_table;
retain i;
by &by_var;
if last.&by_var then do;
i+1;
output;
end;
call symput('t',i);
run;
%do j=1 %to &t;
data _null_;
set a(firstobs=&j obs=&j);
call symput("&by_var._&j",&by_var);
run;
%end;
data
%do i=1 %to &t;
&by_var._&i
%end;
;
set &input_table;
%do i=1 %to &t;
if &by_var="&&&by_var._&i" then output sex_&i;
%end;
run;
%mend;
%out_table(input_table=class,by_var=sex);作者: shiyiming 时间: 2008-7-15 21:31 标题: Re: 练手系列5:多数据集输出 if &by_var="&&&by_var._&i" then output sex_&i;
对不起,这里写错了,sex_&i应该是&by_var._&i
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->作者: shiyiming 时间: 2008-7-15 22:04 标题: Re: 练手系列5:多数据集输出 [code:37g7j22b]
proc sort data=sashelp.class out=class;
by sex;
run;
data _null_;
set class;
by sex;
if first.sex then call execute('data out_'||sex||";set class;where sex='"||sex||"';run;");
run;