楼主: 小鳄鱼a
3243 18

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

  • 6关注
  • 10粉丝

已卖:280份资源

学科带头人

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 |AI写论文
20论坛币
我的宏变量
%let  chosevars=

是一大堆的字符串,引用的时候出现了如下的问题,请问该怎样解决

额外企鹅完全额.jpg (68.56 KB)

额外企鹅完全额.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

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

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

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

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

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-9 12:47