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