全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1697 6
2016-09-05
求问各位大神,为什么MFIRST的值是5678呀??
data one;
input division $ sales;
cards;
A 1234
A 3654
B 5678
;
RUN;
data b;
set one;
by division;
if first.division then call symput("mfirst",sales);
if last.division then call symput("mlast",sales);
%put &mfirst &mlast;
run;


二维码

扫码加我 拉你入群

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

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

全部回复
2016-9-5 19:57:21
首先, %put &mfirst &mlast; 应该写在data步的外面,也就是run; 之后,因为宏语句的执行永远是先于SAS语句;
call symput是在SAS语句执行的时候给宏变量赋值, 所以,如果放在一起,首先执行%put语句,此时宏变量还没有被赋值。

data步执行过程:
第一条,first.division=1, last.division=0, &mfirst=1234;
第二条,first.division=0, last.division=1, &mfirst=1234, &mlast=3654;
第三条,first.division=1, last.division=1, &mfirst=5678, &mlast=5678;
也就是第三条的时候,由于满足if 条件,宏变量就把之前的值覆盖了。
二维码

扫码加我 拉你入群

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

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

2016-9-5 20:10:18
呃 好像还是有点晕~ 为什么第二条时 last.division=1呢?
二维码

扫码加我 拉你入群

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

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

2016-9-5 20:22:25
因为程序里是by division, 简单来说, 如果已经按照division排好序,每个不同的division的第一条记录就是first.division=1,最后一条记录就是last.division=1; 只有一条division=B的记录,所以既是第一条也是最后一条。
二维码

扫码加我 拉你入群

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

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

2016-9-5 20:29:26
明白了!太感谢了!!
二维码

扫码加我 拉你入群

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

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

2016-9-7 12:07:51
wwang111 发表于 2016-9-5 19:57
首先, %put &mfirst &mlast; 应该写在data步的外面,也就是run; 之后,因为宏语句的执行永远是先于SAS语句 ...
受教了
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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