全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1832 6
2011-03-13
有个SAS教程讲循环语句,举例为:
data temp;                        
do class =1 to 2;                 
   input x y @@;               
   output;                           
end;                                 
cards;                              
34 56 78 90 35 67 89 10 23 65 77 45     
;                                                               
run;                                                         
proc print;
run;

程序运行结果为:
Obs    class  x     y
  1       1       34    56
  2       2       78    90
  3       1       35    67
  4       2       89    10
  5       1       23    65
  6       2       77    45

弱弱的问一句,为什么 obs=3时class的值会从2变为1?
求前辈指点。谢谢
二维码

扫码加我 拉你入群

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

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

全部回复
2011-3-13 23:49:51
1# laymanqg data temp;                        
do class =1 to 2;                 
   input x y @@;               
   output;                           
end;                                 
cards;                              
34 56 78 90 35 67 89 10 23 65 77 45     
;                                                               
run;                                                         
proc print;
run;



class=1时,输入x=34,y=56,这是第1个obs;
class=2时,输入x=78,y=90,这是第2个obs;
然后class再循环为1,输入x=35,y=67,这是第3个obs;
这样循环下去……

简单改一下例子
data temp;                        
do class =1 to 3;                 
   input x y @@;               
   output;                           
end;                                 
cards;                              
34 56 78 90 35 67 89 10 23 65 77 45     
;                                                               
run;                                                         
proc print;
run;


结果如下:
                                                 Obs    class     x     y

                                                  1       1      34    56
                                                  2       2      78    90
                                                  3       3      35    67
                                                  4       1      89    10
                                                  5       2      23    65
                                                  6       3      77    45
你应该能懂了吧。
二维码

扫码加我 拉你入群

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

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

2011-3-14 00:02:59
谢谢您的帮助!学SAS才两节课,还望您谅解。
我想再问一下 class=2的时候x y 取值后,循环为什么不结束啊,class只能取到2,为什么又再次循环取1呢?
二维码

扫码加我 拉你入群

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

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

2011-3-14 00:10:46
循环只会等把所有data都赋值给x,y之后才会结束。
do class =1 to 2;
这句话就是class在1和2之间取值。如果你要在1和N之前取值,只需要改成“do class = 1 to N;” 就行了。
(class 是变量名,可以改其他名字。)
二维码

扫码加我 拉你入群

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

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

2011-3-14 00:19:44
噢,我理解错了啊,我以为是class取到2循环就结束了,那obs=3的时候,class又取值为1,是output语句的作用么?我把output语句删掉,结果就成了:
               Obs    class     x     y
                                   1       3      78    90
                                   2       3      89    10
                                   3       3      77    45
二维码

扫码加我 拉你入群

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

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

2011-3-15 20:50:51
我个人认为这里需要加深对PDV (Program Data Vector)的理解。

data step自己本身有一个循环,在每个循环内,
1) PDV更新 _n_(初始化为1,以后每次+1),其他变量重置为missing
2) 通过input读数据进入PDV
3) 把PDV中数据存入data set。

程序运行的步骤是这样的:
a) PDV里 _n_=1,class=.,x=.,y=.
b) PDV里 _n_=1,class=1,x=34,y=56
c-1) 如果有output,程序强行把PDV的数据存入work.temp。
c-2) 如果没有output,继续class的循环。
d) PDV里 _n_仍然=1,class=2,x=78,y=90
e-1) 如果有output,PDV数据存入work.temp的第二行(obs=2)
e-2) 如果没有output,尚未到data step循环第一步的最后。继续循环class=3,停止进入do循环,于是把PDV的数据存入work.temp(obs=1)
f) PDV重置,_n_=2,class=.,x=.,y=.
g) 继续类似重复上述……
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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