请选择 进入手机版 | 继续访问电脑版
楼主: chenji68
2852 8

[问答] [SAS求助]如何从一个宏变量里剔除某些变量? [推广有奖]

  • 8关注
  • 1粉丝

本科生

50%

还不是VIP/贵宾

-

威望
0
论坛币
368 个
通用积分
0.3750
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
786 点
帖子
80
精华
0
在线时间
99 小时
注册时间
2012-5-22
最后登录
2021-12-22

chenji68 发表于 2016-12-10 13:19:13 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
以下的宏变量'variables' 包括上百个变量
%let variables=CASEID a2564toip adequacy adrenalt affordab ageyounp airconp buyhmflg cabletv cdplyer cdwriter ch04toip ch517toip computer condodev cookingp dryerp dshwash dvd dvdwriter ecfam eiflag f001 f002 f008 freezer fypyflag g001 g002 g003 g004 g007 g009 g010 g011 g019 g020 g021 g023 g024 g025 g026 g032 g040 h001 h002 h003 h004 h005 h008 h009 h010 h011 h016 h017 h022 h023 h026 h070 heatage heatfuep heatmaip hhincear hhincinv hhincoth hhinctot hhinctra hhsztotp hhtypep hotwatep i001 i002 i003 i004 i005 i006 i010 i011 i042 i046 ......
然后我想把其中某些变量从上面这个宏变量里面剔除掉, 比如剔除掉以下变量
%let categori= affordab fypyflag urbrur urbsizep typdwelp tenuryrp tentoip repairs buyhmflg heatmaip heatfuep hotwatep ....

请问应该如何剔除掉?

PS: 我的想法本来是用这个
%let noncate=%sysfunc(compress(&variables, %sysfunc(compress(&categori.))));
但是结果不对。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SAS求助 Variables Variable compress Adequacy computer 如何

回帖推荐

chenji68 发表于 2016-12-11 03:34:03 |显示全部楼层 |坛友微信交流群
顶一下!

使用道具

chenji68 发表于 2016-12-12 05:40:44 |显示全部楼层 |坛友微信交流群
顶一下!

使用道具

  1. %let variables=i042 i046 abc edg ace apc;
  2. %let categori=apc;

  3. %let noncate=%sysfunc(compbl(%sysfunc(tranwrd(&variables, &categori,))));

  4. %put &noncate;
复制代码
已有 3 人评分经验 学术水平 热心指数 收起 理由
chenji68 + 1 + 1 精彩帖子
李会超 + 100 + 2 精彩帖子
420948492 + 100 + 1 + 1 精彩帖子

总评分: 经验 + 200  学术水平 + 4  热心指数 + 2   查看全部评分

使用道具

420948492 发表于 2016-12-12 12:30:51 |显示全部楼层 |坛友微信交流群
  1. %let variables=i042 i046 abc edg ace apc;
  2. %let categori=abc ace apc;

  3. %macro dele;
  4. %let n=%eval(%sysfunc(countc(&categori,' '))+1);
  5. %do i=1 %to &n.;
  6. %let ca=%scan(&categori.,&i.);
  7. %let variables=%sysfunc(compbl(%sysfunc(tranwrd(&variables, &ca,))));
  8. %end;
  9. %mend;

  10. %dele;

  11. %put &variables;
复制代码
这个是在楼上的基础上改的,
这个可以实现间断性的变量剔除,有一个使用注意的地方就是变量之间要保证一个空格隔开,为了更局拓展性,可以修改%do %while(%SACN)为自动检测末尾

有人的地方就有江湖

使用道具

420948492 发表于 2016-12-12 12:40:16 |显示全部楼层 |坛友微信交流群
  1. %let variables=i042 i046 abc edg ace apc;
  2. %let categori=abc         ace apc;
  3. %macro dele1;
  4. %let i=1;
  5. %do %while(%length(%scan(&categori.,&i.))>0);
  6. %let  ca=%scan(&categori.,&i.);
  7. %let variables=%sysfunc(compbl(%sysfunc(tranwrd(&variables, &ca,))));
  8. %let i=%eval(&i+1);
  9. %end;
  10. %mend;
  11. %dele1;

  12. %put &variables;
复制代码


这个解决了变量之间的空格问题,

使用道具

zgp480 发表于 2016-12-13 04:04:59 来自手机 |显示全部楼层 |坛友微信交流群
Try this: 把variables和caterial分别写入二个tables,然后用proc sql并且使用条件 not equal就可以找到你需要的variables,然后用data _null_重新写你需要的macro variable

使用道具

Tigflanker 发表于 2016-12-14 16:52:23 |显示全部楼层 |坛友微信交流群
其实用%sysfunc+prxchange应该也行

使用道具

Tigflanker 发表于 2016-12-14 16:58:53 |显示全部楼层 |坛友微信交流群
%let x = s/xxx|yyy|\bzzz\b//;
%let var = aa bb xx zzzzz xxx zzz;

%put %sysfunc(prxchange(&x.,-1,&var.));

你自己用%do做一下第一句,x的处理:用catx以“\b|\b”连接

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 22:41