全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
9189 10
2010-03-14
小弟最近用宏比较多,但也经常被它烦到了在数据步要生成一个期间(span)的变量
data........;
call symput('span', min(intck('month',startdate,enddate), &recspan, intck('month',startdate,TA500261050)));
要在后面宏do循环中引用这个宏变量,
%put span=&span;
%do i=0 %to &span.;
结果是写得有问题,
以下是sas给出的解释:
WARNING: 没有解析符号引用 SPAN。
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: &span.
ERROR: %TO 值(%DO I 循环中)无效。
ERROR: 宏 PIL_LGD 将终止执行。
可是我实在是想不出来哪里有问题啊,望大牛赐教一下。多谢!!!
二维码

扫码加我 拉你入群

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

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

全部回复
2010-3-14 22:23:59
RobertBarro 发表于 2010-3-14 21:41
小弟最近用宏比较多,但也经常被它烦到了在数据步要生成一个期间(span)的变量
data........;
call symput('span', min(intck('month',startdate,enddate), &recspan, intck('month',startdate,TA500261050)));
要在后面宏do循环中引用这个宏变量,
%put span=&span;
%do i=0 %to &span.;
结果是写得有问题,
以下是sas给出的解释:
WARNING: 没有解析符号引用 SPAN。
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: &span.
ERROR: %TO 值(%DO I 循环中)无效。
ERROR: 宏 PIL_LGD 将终止执行。
可是我实在是想不出来哪里有问题啊,望大牛赐教一下。多谢!!!
1) Check to see if macro variable span is defined and is in the way you need.

time_check=min(intck('month',startdate,enddate), &recspan, intck('month',startdate,TA500261050));
put time_check=;

If the value is missing or has decimal, it will cause the proble.

2) USE symputx that is better.


data........;
call symput('span', min(intck('month',startdate,enddate), &recspan, intck('month',startdate,TA500261050)));
二维码

扫码加我 拉你入群

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

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

2010-3-14 23:12:56
大牛,你是说在最后用symputx代替symput么?

另外,我在下边也遇到了同样的问题:
data by.callgd_&obyy._&obmm. ;
set by.callgd_&obyy._&obmm.;
%do i=0 %to &span.;
call symput('aa',intnx('month',startdate,&i.));
call symput('bb',intnx('month',startdate,%eval(&i.-1)));       
%let yy=%sysfunc(year(&aa.));
%let mm=%sysfunc(month(&aa.));
%let by=%sysfunc(year(&bb.));
%let bm=%sysfunc(month(&bb.));

同样是不能引用&aa,&bb的值;似乎是因为call ymput刚刚才用,不能马上引用宏的值? 可是我要用循环不断更新宏变量啊,然后再做函数运算,根本不能分两步来写。。。。。save me~~~help~~~
二维码

扫码加我 拉你入群

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

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

2010-3-14 23:37:49
RobertBarro 发表于 2010-3-14 23:12
大牛,你是说在最后用symputx代替symput么?

另外,我在下边也遇到了同样的问题:
data by.callgd_&obyy._&obmm. ;
set by.callgd_&obyy._&obmm.;
%do i=0 %to &span.;
call symput('aa',intnx('month',startdate,&i.));
call symput('bb',intnx('month',startdate,%eval(&i.-1)));        
%let yy=%sysfunc(year(&aa.));
%let mm=%sysfunc(month(&aa.));
%let by=%sysfunc(year(&bb.));
%let bm=%sysfunc(month(&bb.));

同样是不能引用&aa,&bb的值;似乎是因为call ymput刚刚才用,不能马上引用宏的值? 可是我要用循环不断更新宏变量啊,然后再做函数运算,根本不能分两步来写。。。。。save me~~~help~~~
In a usually case, a macro variable defined in a data step cannot be referred in that step (too soon). A data step needs a clear boundary .-- which begins with data ...; and end with run;

symputx代替symput: yes. symputx will do data data type convertion and trim trailing blanks autometically.

I am not clear for your problem. You had better to define your problem as,
1) what you have,
2) what you want,
3)what is the problem.
二维码

扫码加我 拉你入群

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

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

2010-3-15 00:14:25
谢谢大虾。。。
1)我的数据结构:id variables, startdate, enddate, 一系列计算变量形如x200412-x200712, y200412-y200712 etc. 基本样是横表:one observation with lots of variables at different time points.
2) 我需要根据输入的一个宏变量 &prespan,与intck('month',startdate,enddate)做比较,取最小值记为&span。然后取所有startdate时点的x,y 等算出一个z@startdate, 再移动到x@startdate+1,y@startdate+1算出z@startdate+1, 一直到z@startdate+&span为止。
3)因为我的变量名也希望用startdate,startdate+1....startdate+&span的形式结尾,所以我用了宏do循环,用intnx计算出与startdate距离i个月的日期,然后取year and month做变量名后缀,因为是在一个循环里,所以call symput与下面对宏变量的引用不能分开。我要是用%let  aa=%sysfunc(intnx('month',startdate,&i.))来定义第一个宏变量,它又说startdate不是个数字(而实际上是一个日期了)。

我希望表示清楚了。调这个程序一天了,都快绝望了。。。。
多谢多谢
二维码

扫码加我 拉你入群

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

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

2010-3-15 13:00:56
很久没学sas了,忘得差不多了。印象中call symput生成的宏变量只有在该数据步结束后才能调用,是不是你调用的时间不对?
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群