SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1013|回复: 7
打印 上一主题 下一主题

请教一个MACRO程序

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-9-7 11:35:03 | 只看该作者

请教一个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?
谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-9-7 20:47:32 | 只看该作者

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);不知道是否可行,好像增加变量可以,但减少变量就不太容易了,希望大侠出手相助.
谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-9-8 04:42:35 | 只看该作者

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]
什么叫没有固定格式?你总得把你的秘密透露一点给我们吧。。。
京剧
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-9-8 21:04:30 | 只看该作者

Re: 请教一个MACRO程序

最后新生成的group_id中含有'.',请问能不能去掉?

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

谢谢jingju11,牛人.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-9-8 21:12:11 | 只看该作者

Re: 请教一个MACRO程序

[code:31j5jfwk]options missing =" ";
%gpd()
..
;
options missing =.;[/code:31j5jfwk]
I assume x1 x2... are numerical missing.

JingJu
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-9-9 03:42:39 | 只看该作者

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

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-9-11 14:35:18 | 只看该作者

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

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-9-23 01:08:13 | 只看该作者

Re: 请教一个MACRO程序

nice job, byes, thank you.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-7 21:02 , Processed in 0.070904 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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