SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 3505|回复: 18
打印 上一主题 下一主题

练手系列5:多数据集输出

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-7-15 17:13:27 | 只看该作者

练手系列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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-7-15 17:15:25 | 只看该作者

自己先来抛砖引玉

不成熟的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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2008-7-15 21:26:16 | 只看该作者

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);
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-7-15 21:31:02 | 只看该作者

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 -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-7-15 22:04:32 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-7-16 09:30:27 | 只看该作者

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 -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2008-7-16 12:03:16 | 只看该作者

Re: 练手系列5:多数据集输出

题目只是拿sashelp.class做个例子,要把这个扩展
不过楼上的方法还是学习下。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2008-7-16 12:30:45 | 只看该作者

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 -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2008-7-16 18:03:35 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2008-7-16 18:04:17 | 只看该作者

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]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 03:23 , Processed in 0.078703 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表