全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2785 8
2016-08-02
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此时是如何存储数据的? 谢谢

二维码

扫码加我 拉你入群

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

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

全部回复
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;
二维码

扫码加我 拉你入群

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

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

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;
二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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的时候才会输出。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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