SAS中文论坛

标题: 请教一个MACRO程序 [打印本页]

作者: shiyiming    时间: 2011-9-7 11:35
标题: 请教一个MACRO程序
想写一个MACRO来随意改变group ID(由几个变量组成)的构成成分,即希望这个group ID能随意的增加或减少变量.比如:
data a;
input x1 x2 x3 x4 x5 x6 y;
group_id=cats(x1,x2,x3,x4);/*通常由x1,x2,x3,x4组成group_id*/
cards;
1 2 3 4 5 6 10000
...
;
run;
但有些情况下,要求能用不断的变化的group_id来分别计算一些结果.
e.g.,
%macro gpd(datain=,dataout=,include=,exclude=);
/*但有时候需要改变group_id,通过增加其他变量或减少其组成变量来实现*/
...
%mend;
比如要求:
1.要增加x5和x6进入group_id(此时group_id由x1,x2,x3,x4,x5,x6组成),可以通过下面来实现:
%gpd(datain=a,dataout=b, include=x5 x6, exclude=)
2.要从正常的group_id中减少x2和x3(此时group_id仅由x1,x4组成),可以通过下面来实现:
%g(datain=a,dataout=b,include=, exclude=x2 x3)

请问这个MACRO改如何写,从而能改变这个grouo_id?
谢谢!
作者: shiyiming    时间: 2011-9-7 20:47
标题: Re: 请教一个MACRO程序
group_id没有固定格式,或者group_id=catx(' ',x1,x2,x3,x4);
是不是要先建立一个gpd_list=x1 x2 x3 x4 &include;
然后gpd_list=prxchange(gpd_list,-1, &include);不知道是否可行,好像增加变量可以,但减少变量就不太容易了,希望大侠出手相助.
谢谢!
作者: shiyiming    时间: 2011-9-8 04:42
标题: Re: 请教一个MACRO程序
[code:3uawsan3]%macro gpd(datain=,dataout=,include=,exclude=);
        %let xs =x1 x2 x3 x4;
        data &dataOUT;        keep group_id;
                set &dataIN(keep =&xs &include);
                %if (&exclude ne) %then call missing(of &exclude);;
                group_id =cats(of &xs &include);
        run;
        data &dataOUT;
                merge &dataIN &dataOUT;
        run;
%mend gpd;

%gpd(datain=a,dataout=bb, include=x5 x6, exclude=x2 x3)[/code:3uawsan3]
什么叫没有固定格式?你总得把你的秘密透露一点给我们吧。。。
京剧
作者: shiyiming    时间: 2011-9-8 21:04
标题: Re: 请教一个MACRO程序
最后新生成的group_id中含有'.',请问能不能去掉?

ps:你的方法很巧妙,我一直在想通过prxchange来去x2 x3,不知道可行吗?

谢谢jingju11,牛人.
作者: shiyiming    时间: 2011-9-8 21:12
标题: Re: 请教一个MACRO程序
[code:31j5jfwk]options missing =" ";
%gpd()
..
;
options missing =.;[/code:31j5jfwk]
I assume x1 x2... are numerical missing.

JingJu
作者: shiyiming    时间: 2011-9-9 03:42
标题: Re: 请教一个MACRO程序
%if (&exclude ne) %then call missing(of &exclude) [u:2lzb1rux][b:2lzb1rux];;[/b:2lzb1rux][/u:2lzb1rux]----------------------------------------------------------------------
why should we use ';;' here instead of ';'?
Thx a lot.
作者: shiyiming    时间: 2011-9-11 14:35
标题: Re: 请教一个MACRO程序
[code:uk834y2f]%macro gpd(datain=,dataout=,include=,exclude=);
        %let origin=x1 X2 x3 x4;
        %let str=&origin &include;
        %if &exclude ne %then %do;
                %let id=%str(s/)%sysfunc(tranwrd(%cmpres(&exclude),%str( ),%str(|)))%str(//i);
                %let str=%sysfunc(prxchange(%sysfunc(prxparse(&id)),-1,&str));
        %end;
        data &dataout;
                set &datain;
                group_id=cats(of &str);
        run;
%mend;
%gpd(datain=a,dataout=result,include=x5,exclude=x1 x4);[/code:uk834y2f]
作者: shiyiming    时间: 2011-9-23 01:08
标题: Re: 请教一个MACRO程序
nice job, byes, thank you.




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