楼主: laymanqg
1880 6

初学SAS,发个问题,请前辈指点 [推广有奖]

  • 0关注
  • 0粉丝

初中生

9%

还不是VIP/贵宾

-

威望
0
论坛币
2 个
通用积分
0.0600
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
350 点
帖子
12
精华
0
在线时间
8 小时
注册时间
2011-3-12
最后登录
2022-1-11

楼主
laymanqg 发表于 2011-3-13 23:26:45 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
有个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?
求前辈指点。谢谢
二维码

扫码加我 拉你入群

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

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

关键词:初学sas 前辈指点 output Input SAS教程 SAS 指点 初学 前辈

沙发
zgu9 发表于 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
你应该能懂了吧。

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

板凳
zgu9 发表于 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 是变量名,可以改其他名字。)

报纸
laymanqg 发表于 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

地板
myc_sas 发表于 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) 继续类似重复上述……

7
laymanqg 发表于 2011-3-19 00:35:28
myc_sas 发表于 2011-3-15 20:50
我个人认为这里需要加深对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) 继续类似重复上述……
谢谢您的解释,说到我最疑惑的地方了!

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

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