楼主: 内画瓶
1427 6

求问各位大神,为什么MFIRST的值是5678呀?? [推广有奖]

  • 1关注
  • 0粉丝

硕士生

5%

还不是VIP/贵宾

-

威望
0
论坛币
12 个
通用积分
5.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
10102 点
帖子
27
精华
0
在线时间
206 小时
注册时间
2014-9-13
最后登录
2023-10-14

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
求问各位大神,为什么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;


二维码

扫码加我 拉你入群

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

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

关键词:First FIRS FIR IRS Division

回帖推荐

wwang111 发表于2楼  查看完整内容

首先, %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.divis ...

wwang111 发表于4楼  查看完整内容

因为程序里是by division, 简单来说, 如果已经按照division排好序,每个不同的division的第一条记录就是first.division=1,最后一条记录就是last.division=1; 只有一条division=B的记录,所以既是第一条也是最后一条。
沙发
wwang111 发表于 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呢?

使用道具

板凳
wwang111 发表于 2016-9-5 20:22:25 |只看作者 |坛友微信交流群
因为程序里是by division, 简单来说, 如果已经按照division排好序,每个不同的division的第一条记录就是first.division=1,最后一条记录就是last.division=1; 只有一条division=B的记录,所以既是第一条也是最后一条。

使用道具

报纸
内画瓶 发表于 2016-9-5 20:29:26 |只看作者 |坛友微信交流群
明白了!太感谢了!!

使用道具

地板
linshuhe123 发表于 2016-9-7 12:07:51 |只看作者 |坛友微信交流群
wwang111 发表于 2016-9-5 19:57
首先, %put &mfirst &mlast; 应该写在data步的外面,也就是run; 之后,因为宏语句的执行永远是先于SAS语句 ...
受教了

使用道具

7
linshuhe123 发表于 2016-9-7 13:21:54 |只看作者 |坛友微信交流群
wwang111 发表于 2016-9-5 19:57
首先, %put &mfirst &mlast; 应该写在data步的外面,也就是run; 之后,因为宏语句的执行永远是先于SAS语句 ...
讲解的很详细,受教了

使用道具

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

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

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

GMT+8, 2024-4-19 13:47