请选择 进入手机版 | 继续访问电脑版
2127 7

Crackman第35题不懂,请指教 [推广有奖]

  • 0关注
  • 0粉丝

本科生

61%

还不是VIP/贵宾

-

威望
0
论坛币
471 个
通用积分
7.0000
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
758 点
帖子
22
精华
0
在线时间
176 小时
注册时间
2016-7-5
最后登录
2022-7-27

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
二楼为答案解析原文,看得一头雾水。

35 (tough) Write to multiple data sets


35.given the SAS data set SASDATA.TWO:



X  Y


  ----


5  2


3  1


5  6



The following SAS program is submitted:


data SASUSER.ONE  SASUSER.TWO  OTHER;


    set SASDATA.TWO;


    if X eq 5 then output SASUSER.ONE;


    if Y lt 5 then output SASUSER.TWO;


    output;


run;



What is the result?



    A.


dataset SASUSER.ONE has 5 observations   


data set SASUSER.TWO has 5 observations


data set WORK.OTHER  has 3 observations



    B.


dataset SASUSER.ONE has 2 observations   


data set SASUSER.TWO has 2 observations


data set WORK.OTHER  has 1 observations



    C.


dataset SASUSER.ONE has 2 observations   


data set SASUSER.TWO has 2 observations


data set WORK.OTHER  has 5 observations



    D. No data sets are output. The DATA step fails execution due to syntaxerrors.






二维码

扫码加我 拉你入群

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

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

关键词:crackman Ackman CRACK CRA Man following multiple result tough

这道题是一个非常有意思的题。
其实考察的就是两个output语句对数据输出的影响。
下面对数据的执行过程进行解析:
程序编译之后,建立了PDV。
当从数据集SASDATA.TWO中读入第一条数据,
开始IF判断,判断为真就是OUTPUT到SASUSER.ONE数据集中。但是这里没有交代如果为假将会怎么样。我个人认为即使是假,也不会做任何处理。因为没有在假这个条件下的执行语句。
继续判断,如果Y lt 5 then output SASUSER.TWO;
记住一个点,也是PDV中,一条观测的在PDV中存在周期问题,如果OUTPUT出去了,是不是PDV中这一条数据就立即消失,全部为默认值了?这里就是 关键所在,我个人觉得这个时候PDV没有中新的SET SASDATA.TWO或者INPUT时候,PDV应该是保留上次的值。那么到了
OUTPUT语句时,其实默认输出到三个数据集中。
所以导致5 2 这条观测以及5 6 这条被输出两次到SASUSER.ONE,加上3 1这一条是通过最后一条OUTPUT语句输出的,所以就是5条。
同样SASUSER.TWO也是5条 OTHER是3条

使用道具

为什么one two other的观测是5 5 3?

使用道具

wwang111 发表于 2016-9-25 20:57:20 |显示全部楼层 |坛友微信交流群
PDV在每条记录读取之前,即读到run语句返回到data语句的时候,会把没有retain的变量初始化为空值;
但是,如果记录是来自数据集而不是在程序中定义的或者inpu外部文件,PDV只有在编译过程中把变量初始化为空值,之后每一条记录读取之前都不会把变量初始化为空值,而是读到新的一条记录的时候,覆盖之前的值。

拿楼主举的例子来说,每读到一次set,就会读取一条数据集two中的记录:

编译结束之后,x, y是空值;
data步开始第一次执行,读到set two, PDV里面x=5,y=2;继续执行判断第一个if条件为真,x=5,y=2会输出到one;
此时,第一次data步还没执行结束,所以PDV里面仍然是x=5,y=2;
继续判断第二个if条件也为真,x=5,y=2会输出到two;
此时第一次data步仍然没有执行结束,继续执行没有条件的output语句,所以x=5,y=2会输出到one, two, other;
然后碰到run,此次data步执行结束,返回data,开始第二次执行;
因为x=5,y=2是数据集中来的,所以PDV不会被初始化为空值,仍然是x=5,y=2,读到set two的时候,第二条记录x=3,y=1会读进来,覆盖之前的x=5,y=2,然后开始下面的执行,跟第一次类似。

使用道具

franky_sas 发表于 2016-9-27 14:33:32 |显示全部楼层 |坛友微信交流群
wwang111 发表于 2016-9-25 20:57
PDV在每条记录读取之前,即读到run语句返回到data语句的时候,会把没有retain的变量初始化为空值;
但是, ...
good explaination

使用道具

DriftKingHan 发表于 2016-9-27 22:34:45 |显示全部楼层 |坛友微信交流群
wwang111 发表于 2016-9-25 20:57
PDV在每条记录读取之前,即读到run语句返回到data语句的时候,会把没有retain的变量初始化为空值;
但是, ...
您好
看到回复中有一句话是之前看书时一直没有理解的,想请教一下,这样理解是不是可以
对于来自数据集的数据,是每一次执行data步都省略了清空的操作,直接覆盖,这样理解可以吗
另外还想请教一下,比如读到obs2 了,obs2中有一个变量本身就是missing,是不是同样把PDV中obs1的对应变量覆盖为missing呢
谢谢了
如果记录是来自数据集而不是在程序中定义的或者inpu外部文件,PDV只有在编译过程中把变量初始化为空值,之后每一条记录读取之前都不会把变量初始化为空值,而是读到新的一条记录的时候,覆盖之前的值。

使用道具

wwang111 发表于 2016-9-28 11:40:30 |显示全部楼层 |坛友微信交流群
我觉得你可以这样理解:

set数据集的过程就是不断覆盖PDV中之前的记录,然后输出到数据集的过程,在程序中没有Output语句的情况下,碰到run语句,就会输出一条记录到数据集,所以第一个问题,我觉得你的理解是正确的。

第二个问题,在set的过程中,对于记录中有missing的情况,比如有变量x, x=1和x=.的地位是一样的,不能说因为x=.,这条空的记录就不会被读到PDV当中,所以,空值当然也会读进PDV,覆盖之前的值。

使用道具

DriftKingHan 发表于 2016-9-28 23:20:10 |显示全部楼层 |坛友微信交流群
wwang111 发表于 2016-9-28 11:40
我觉得你可以这样理解:

set数据集的过程就是不断覆盖PDV中之前的记录,然后输出到数据集的过程,在程序 ...
非常感谢您的解答,谢谢

使用道具

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

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

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

GMT+8, 2024-3-29 04:13