全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
10981 25
2011-11-13
看见mitbbs上的一个问题,正好我也不懂   求解释  谢谢


为什么“if _n_=1 then do until (last)”这一段中要用if _n_=1来判断呢?如果不
用的话,sum_x sum_y都是可以正确求出来,但是obs就是missing

请教一下这儿‘if _n_=1’起的什么作用?

data temp;
input x y@;
datalines;
1 2
3 4
5 6
. 9
6 7
7 .
1 8
6 3
;
run;

data q3;
    if _n_=1 then do until (last);
        set temp nobs=obs end=last;
        sum_x+x;
        sum_y+y;
    end;
    set temp;
    if x=. then x=sum_x/obs;
    if y=. then y=sum_y/obs;
run;
二维码

扫码加我 拉你入群

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

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

全部回复
2011-11-13 21:22:03
最有趣的是这个事实:

运行以下代码:

复制代码

结果为:

--------------------------------------------------------------------------

                                           Obs    b    a
                                            1       1    4

--------------------------------------------------------------------------

但是,只要改一改,在do前加上if _n_=1 then,即:

复制代码

其结果照说应该不变,但是,真实结果却奇迹地变成:

--------------------------------------------------------------------------

                                           Obs    b    a
                                            1       1    4
                                            2       1    4

--------------------------------------------------------------------------

我以为这是 if  语句造成的,于是我试着将其变为 if 1+1=2 then,但是,其结果仍是前者,而非后者。

也就是说,造成第二种结果的关键不在"if _n_=1 then"中的 if  ,而在于其中的"_n_=1"!

为什么会出现第二种输出结果呢?

有高手能解释一下DATA步的内部操作原理么?



二维码

扫码加我 拉你入群

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

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

2011-11-13 21:41:02
我认为这是一个彻头彻尾的BUG,用以下程序更直接的突出这个BUG:

复制代码

结果为:

---------------------------------------------------------------------------

                                         Obs    b    final
                                          1       1      0
                                          2       2      1
                                          3       2      .

---------------------------------------------------------------------------

注意第3行final变量的那个空值,它表示第3行是“失落”的一行,它甚至都不能表明自身是否是最后一行!

这简直是笑话。

我不知道究竟是怎样的内部机制造成了这样荒唐的结果!

更让我不解的是,将if _n_<3 换成 if _n_<=3 ,即:

复制代码

结果变成:

---------------------------------------------------------------------------

                                         Obs    b    final
                                          1       1      0
                                          2       2      1

---------------------------------------------------------------------------

为什么?为什么会有如此的差别?

这不是BUG是什么?

二维码

扫码加我 拉你入群

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

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

2011-11-13 22:05:50
现在我将进一步发现的“奇怪现象”记录在下面:

程序1:

复制代码

结果为:

-----------------------------------------------------------------------------

                                         Obs    b    final
                                          1       1      4
                                          2       2      4
                                          3       2      .

-----------------------------------------------------------------------------

程序2:将程序1的final=4从do循环里拿出来,变为:

复制代码

结果为:

-----------------------------------------------------------------------------

                                         Obs    final    b
                                          1         4      1
                                          2         4      2
                                          3         4      2

-----------------------------------------------------------------------------

程序3:将程序1中的final=4改为final+4,变为:

复制代码

结果为:

-----------------------------------------------------------------------------

                                         Obs    b    final
                                          1       1      4
                                          2       2      8
                                          3       2      8

-----------------------------------------------------------------------------

这些记录有助于找出_n_相关的内在机理。
二维码

扫码加我 拉你入群

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

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

2011-11-13 22:26:52
有意思,关注中
二维码

扫码加我 拉你入群

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

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

2011-11-14 10:41:59
在对应的地方添加put _all_;语句并且看下log,可以帮助理解data步的机制
_N_不是记录的条数,而是data步循环的执行次数,虽然在某些简单代码里可以等同于当前记录数

希望对你有帮助
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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