SAS中文论坛

标题: 练手系列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&#46;class out=class;
        by sex;
run;
data _null_;
        set class;
        by sex;
        if first&#46;sex then call execute('data out_'||sex||&quot;;set class;where sex='&quot;||sex||&quot;';run;&quot;);
run;

[/code:37g7j22b]
作者: shiyiming    时间: 2008-7-16 09:30
标题: Re: 练手系列5:多数据集输出
call execute('data out_'||sex||&quot;;set class;where sex='&quot;||sex||&quot;';run;&quot;);

学习了  <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2008-7-16 12:03
标题: Re: 练手系列5:多数据集输出
题目只是拿sashelp.class做个例子,要把这个扩展
不过楼上的方法还是学习下。
作者: shiyiming    时间: 2008-7-16 12:30
标题: Re: 练手系列5:多数据集输出
byes的程序很简洁新颖,赞!

有没有人愿意用proc sql,proc contents,proc means,proc tabulate,proc report等任何有创意的方式来尝试? <!-- s:o --><img src="{SMILIES_PATH}/icon_surprised.gif" alt=":o" title="Surprised" /><!-- s:o -->
作者: shiyiming    时间: 2008-7-16 18:03
标题: Re: 练手系列5:多数据集输出
[code:1by2roh5]
%macro create_multiple_outputs(source_table=,by_var=,output_var=,output_table_prefix=);
        proc sort data=&amp;source_table&#46; out=tmp;
           by &amp;by_var;
        run;
        data _null_;
           set tmp;
           by &amp;by_var&#46;;
           if first&#46;&amp;by_var&#46; then call execute(&quot;data &amp;output_table_prefix&#46;&quot;||&amp;by_var&#46;||&quot;(keep=&amp;by_var&#46; &amp;output_var&#46;);set tmp;where sex='&quot;||&amp;by_var&#46;||&quot;';run;&quot;);
        run;
%mend;
[/code:1by2roh5]
作者: shiyiming    时间: 2008-7-16 18:04
标题: Re: 练手系列5:多数据集输出
[code:29n0s5hr]

%macro create_multiple_outputs(source_table=,by_var=,output_var=,output_table_prefix=);
proc sql noprint;
        select distinct &amp;by_var&#46; into &#58;name separated by '|'  from &amp;source_table&#46;;
quit;
%let nword=%sysfunc(countc(&amp;name,|));
%let nword=%eval(&amp;nword+1);
%do i=1 %to &amp;nword&#46;;
        %let name1=%scan(&amp;name&#46;,&amp;i&#46;,|);
        proc sql;
                create table &amp;output_table_prefix&#46;&amp;name1&#46; as
                        select &amp;by_var&#46;,&amp;output_var&#46;  from sashelp&#46;class where &amp;by_var=&quot;&amp;name1&#46;&quot;;
        quit;
%end;
%mend;
[/code:29n0s5hr]
作者: shiyiming    时间: 2008-7-16 18:10
标题: Re: 练手系列5:多数据集输出
contents,means,tabulate都想了一下,想出来的方法觉得一套,没什么创意,所以不写了。
留给大家了。
作者: shiyiming    时间: 2008-7-16 21:54
标题: Re: 练手系列5:多数据集输出
只有看的份了。。。  <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->
作者: shiyiming    时间: 2008-7-17 17:18
标题: Re: 练手系列5:多数据集输出
byes太牛了。佩服。
作者: shiyiming    时间: 2008-7-19 19:50
标题: Re: 练手系列5:多数据集输出
byes 收我做徒弟吧,绝对不给你丢人。。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2008-9-5 16:17
标题: Re: 练手系列5:多数据集输出
byes的回复看得我寒毛倒竖,赞!!!!
作者: shiyiming    时间: 2008-9-17 15:34
标题: Re: 练手系列5:多数据集输出
[quote=&quot;byes&quot;:eiyj1p73][code:eiyj1p73]

%macro create_multiple_outputs(source_table=,by_var=,output_var=,output_table_prefix=);
proc sql noprint;
        select distinct &amp;by_var&#46; into &#58;name separated by '|'  from &amp;source_table&#46;;
quit;
%let nword=%sysfunc(countc(&amp;name,|));
%let nword=%eval(&amp;nword+1);
%do i=1 %to &amp;nword&#46;;
        %let name1=%scan(&amp;name&#46;,&amp;i&#46;,|);
        proc sql;
                create table &amp;output_table_prefix&#46;&amp;name1&#46; as
                        select &amp;by_var&#46;,&amp;output_var&#46;  from sashelp&#46;class where &amp;by_var=&quot;&amp;name1&#46;&quot;;
        quit;
%end;
%mend;
[/code:eiyj1p73][/quote:eiyj1p73]
为什么要在变量后面加一个.呢? 如&amp;name.    &amp;i.
作者: shiyiming    时间: 2008-9-29 22:22
标题: Re: 练手系列5:多数据集输出
好,支持
作者: shiyiming    时间: 2008-10-29 14:12
标题: Re: 练手系列5:多数据集输出
shiyiming 你那个程序如果有重复的key好象不行吧
作者: shiyiming    时间: 2008-10-29 14:39
标题: Re: 练手系列5:多数据集输出
没错,我只是抛砖引玉,想一些让大家一起练练手。仅仅看书是没有用的,只能靠多想多试多练。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2