请选择 进入手机版 | 继续访问电脑版
楼主: 小鳄鱼a
2516 18

引用宏变量出现的问题 [推广有奖]

  • 6关注
  • 10粉丝

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

小鳄鱼a 发表于 2014-10-23 14:56:04 |显示全部楼层 |坛友微信交流群
20论坛币
我的宏变量
%let  chosevars=

是一大堆的字符串,引用的时候出现了如下的问题,请问该怎样解决
额外企鹅完全额.jpg

最佳答案

sniperhgy 查看完整内容

楼主你好,我将那个%str改成了%quote,貌似可以运行了,你试试看。 而且感觉楼主的意思是,那个&dat里面有很多变量,如果某一个变量为空值,就把整行搞死,对吧?可以不用循环的啊,直接解析出有多少个变量,然后用%do拼接处多少个or条件来,这样一次data部就把楼主要做的事情都干了。
关键词:vars VaR let HOS EVA 字符串
sniperhgy 发表于 2014-10-23 14:56:05 |显示全部楼层 |坛友微信交流群
小鳄鱼a 发表于 2014-10-23 15:46
直接把字符串代入,不用chosevars是可以的,但是下面的程序还要用到这个宏变量,所以不得不用chosevars
楼主你好,我将那个%str改成了%quote,貌似可以运行了,你试试看。 而且感觉楼主的意思是,那个&dat里面有很多变量,如果某一个变量为空值,就把整行搞死,对吧?可以不用循环的啊,直接解析出有多少个变量,然后用%do拼接处多少个or条件来,这样一次data部就把楼主要做的事情都干了。
  1. %macro dropguance(index=,dat=,delim=%str(,));
  2.   %let i=1;
  3.   %do %while(%scan(%quote(&index),&i,%quote(&delim)) ne );
  4.     %let Nindex=%scan(%quote(&index),&i,%quote(&delim));

  5.     data &dat;
  6.       set &dat;
  7.       if &Nindex=. then delete;
  8.     run;
  9.         %put &i.;
  10.     %let i=%eval(&i+1);
  11.   %end;
  12. %mend;

  13. %let chosevars=cv,netppediva,bm,gsdiva,yroevot,rsq,meancashvot,yroavot,meanygsvot,lgcomtrdturnr,meanyincomevot,cost,drsbl,owncon1;

  14. %dropguance(index=%quote(&chosevars),dat=zonghe,delim=%str(,));
复制代码
已有 2 人评分论坛币 学术水平 热心指数 收起 理由
小鳄鱼a + 5 + 1 + 1 精彩帖子
admin_kefu + 60 根据规定进行奖励

总评分: 论坛币 + 65  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

sniperhgy 发表于 2014-10-23 14:59:30 |显示全部楼层 |坛友微信交流群
贴出完整程序看一下,要是有要应用的数据集就更好了(关于quoting函数,我之前研究过一些,希望对楼主能有帮助)

使用道具

小鳄鱼a 发表于 2014-10-23 15:44:44 |显示全部楼层 |坛友微信交流群
sniperhgy 发表于 2014-10-23 14:59
贴出完整程序看一下,要是有要应用的数据集就更好了(关于quoting函数,我之前研究过一些,希望对楼主能有帮 ...
  1. %macro dropguance(index=,dat=,delim=%str(,));



  2. %let i=1;
  3. %do %while(%scan(%quote(&index),&i,%quote(&delim)) ne );
  4. %let Nindex=%scan(%quote(&index),&i,%quote(&delim));




  5. data &dat;
  6. set &dat;
  7. if &Nindex=. then delete;
  8. run;



  9. %let i=%eval(&i+1);
  10. %end;


  11. %mend;
  12. %dropguance(index=%str( &chosevars),
  13. dat=zonghe ,
  14. delim=%str(,));
复制代码

使用道具

小鳄鱼a 发表于 2014-10-23 15:45:20 |显示全部楼层 |坛友微信交流群
sniperhgy 发表于 2014-10-23 14:59
贴出完整程序看一下,要是有要应用的数据集就更好了(关于quoting函数,我之前研究过一些,希望对楼主能有帮 ...
%let chosevars=cv, netppediva, bm ,gsdiva, yroevot,   rsq , meancashvot,yroavot ,   
meanygsvot , lgcomtrdturnr ,meanyincomevot, cost, drsbl,owncon1;

使用道具

小鳄鱼a 发表于 2014-10-23 15:46:24 |显示全部楼层 |坛友微信交流群
sniperhgy 发表于 2014-10-23 14:59
贴出完整程序看一下,要是有要应用的数据集就更好了(关于quoting函数,我之前研究过一些,希望对楼主能有帮 ...
直接把字符串代入,不用chosevars是可以的,但是下面的程序还要用到这个宏变量,所以不得不用chosevars

使用道具

小鳄鱼a 发表于 2014-10-23 20:56:24 |显示全部楼层 |坛友微信交流群
sniperhgy 发表于 2014-10-23 16:06
楼主你好,我将那个%str改成了%quote,貌似可以运行了,你试试看。 而且感觉楼主的意思是,那个&dat里面有 ...
可以运行,多谢了,%quote 与%str  有什么简单的区别吗    看了很多都看不懂  。是的

使用道具

小鳄鱼a 发表于 2014-10-23 20:57:12 |显示全部楼层 |坛友微信交流群
sniperhgy 发表于 2014-10-23 16:06
楼主你好,我将那个%str改成了%quote,貌似可以运行了,你试试看。 而且感觉楼主的意思是,那个&dat里面有 ...
能不能把你的方法写一下   新手啥都不懂得

使用道具

sniperhgy 发表于 2014-10-23 21:21:09 |显示全部楼层 |坛友微信交流群
小鳄鱼a 发表于 2014-10-23 20:57
能不能把你的方法写一下   新手啥都不懂得
楼主你好,%str和%quote的区别在于,起作用的时间不一样,%str是在编译的时候,%quote是在运行的时候,第一次没成功是因为用了%str,虽然可以通过编译,但是一旦到了执行的时候,%str就不起作用了,然后那些逗号就被SAS认为是参数的分隔符,第二次换成了%quote,运行的时候,SAS认为那些逗号是字符串,不是分隔符,所以就没有问题了。

使用道具

小鳄鱼a 发表于 2014-10-23 22:01:45 |显示全部楼层 |坛友微信交流群
sniperhgy 发表于 2014-10-23 21:21
楼主你好,%str和%quote的区别在于,起作用的时间不一样,%str是在编译的时候,%quote是在运行的时候,第 ...
%quote不仅仅在执行中其作用吧,在编译时是不是也起作用

使用道具

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

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

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

GMT+8, 2024-4-19 07:53