楼主: Arithmetic09
2869 8

do loop和set语句 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

初中生

14%

还不是VIP/贵宾

-

威望
0
论坛币
43 个
通用积分
0
学术水平
2 点
热心指数
2 点
信用等级
0 点
经验
100 点
帖子
12
精华
0
在线时间
9 小时
注册时间
2016-6-20
最后登录
2016-8-10

楼主
Arithmetic09 发表于 2016-8-2 16:26:44 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
data a1;
        age=32; sex='M'; height=165; output;
        age=23; sex='F'; height=176; output;
        age=41; sex='F'; height=157; output;
run;

data eg;
        do i=1 to 3;
                set a1;
        end;
run;
如上述程序, 最后出来的结果是a1当中的最后一条观测,如果加上output语句的话,三条观测才会出现.请问为什么会出现这种情况?
在查阅资料的时候看到一句话说这种情况会越过sas supervisor, 因此没有implied output performed. 请问上述情况是由于这个原因吗,还麻烦大家详细的解释一下,谢谢.
还有,pdv此时是如何存储数据的? 谢谢

二维码

扫码加我 拉你入群

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

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

关键词:loop Set supervisor performed Implied performed 程序 如何 资料

回帖推荐

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

我觉得你可以这样理解: SAS的data步每执行一次,在没有output语句的情况下,只会输出一条记录,就是读到run的时候,一条记录会自动输出; 在你举例的程序中,读到run之前,整个do循环已经执行完毕,而且只是在一条记录上执行的; i=1时,age=32; sex='M'; height=165;读到PDV中,此时这条记录没有输出,会继续执行i=2,第二条记录读进PDV就把之前的age,sex,height的值覆盖了,直到循环结束,新数据集只会输出a1的最后一条记录。 ...

沙发
wwang111 发表于 2016-8-2 17:10:42
在SAS默认的情况下,data步中每一行数据读取结束,都会有一个隐藏的output,使得这一行数据输出 ;
但是如果在程序中用到了output语句,这个隐藏的output就失效了。
所以,如果最后一条记录没有output, 前两行数据正常输出,但读完第三行之后,没发现有output语句,此时隐藏的output也失效了,读到run之后,发现这次循环结束,就会回到data开始下一次读取,此时发现已经没有数据可读,此次data步就结束了,所以第三行就不会出现了。

至于在PDV里面的情况,可以看一下put出来的信息:

data a1;
file print;
put "After Compile but Before Execute: " _all_;
        age=32; sex='M'; height=165; output;
put "After First Obs Execute but Before Second Obs Execute: " _all_;
        age=23; sex='F'; height=176; output;
put "After Second Obs Execute but Before Third Obs Execute: " _all_;
        age=41; sex='F'; height=157;output;
put "After Third Obs Execute: " _all_;
run;

藤椅
dengwei715 发表于 2016-8-3 01:32:17
我猜楼主想调用各行的变量,请参考
data a1;
        age=32; sex='M'; height=165; output;
        age=23; sex='F'; height=176; output;
        age=41; sex='F'; height=157; output;
run;


data _null_; set a1;
call symput("a_"||left(_n_), age);
run;

%put &a_1  &a_2  &a_3;

板凳
Arithmetic09 发表于 2016-8-8 11:22:12
wwang111 发表于 2016-8-2 17:10
在SAS默认的情况下,data步中每一行数据读取结束,都会有一个隐藏的output,使得这一行数据输出 ;
但是如 ...
谢谢,可是如果DO 和SET语句共同使用的话,为什么只会出现DO循环结束时读入的那一条观测啊?

报纸
Arithmetic09 发表于 2016-8-8 11:22:59
dengwei715 发表于 2016-8-3 01:32
我猜楼主想调用各行的变量,请参考
data a1;
        age=32; sex='M'; height=165; output;
谢谢~~~~~~

地板
wwang111 发表于 2016-8-8 11:35:06
我觉得你可以这样理解:
SAS的data步每执行一次,在没有output语句的情况下,只会输出一条记录,就是读到run的时候,一条记录会自动输出;
在你举例的程序中,读到run之前,整个do循环已经执行完毕,而且只是在一条记录上执行的;
i=1时,age=32; sex='M'; height=165;读到PDV中,此时这条记录没有输出,会继续执行i=2,第二条记录读进PDV就把之前的age,sex,height的值覆盖了,直到循环结束,新数据集只会输出a1的最后一条记录。

data eg;
        do i=1 to 3;
                set a1;
                output;
        end;
run;
加一个output语句,会使每一条记录都输出;
原因是程序中遇到output语句时,原本碰到run会自动输出记录的功能就失效了,只有碰到output的时候才会输出。

7
Arithmetic09 发表于 2016-8-8 14:36:21
wwang111 发表于 2016-8-8 11:35
我觉得你可以这样理解:
SAS的data步每执行一次,在没有output语句的情况下,只会输出一条记录,就是读到r ...
恩,真是太感谢啦~

8
Arithmetic09 发表于 2016-8-8 14:36:24
wwang111 发表于 2016-8-8 11:35
我觉得你可以这样理解:
SAS的data步每执行一次,在没有output语句的情况下,只会输出一条记录,就是读到r ...
恩,真是太感谢啦~

9
Arithmetic09 发表于 2016-8-8 14:36:25
wwang111 发表于 2016-8-8 11:35
我觉得你可以这样理解:
SAS的data步每执行一次,在没有output语句的情况下,只会输出一条记录,就是读到r ...
恩,真是太感谢啦~

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

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