楼主: 逍遥梦蝶
2272 4

[问答] DO循环与OUTPUT结合的一个小疑问 [推广有奖]

  • 3关注
  • 18粉丝

学科带头人

99%

还不是VIP/贵宾

-

威望
0
论坛币
17149 个
通用积分
980.0051
学术水平
111 点
热心指数
117 点
信用等级
87 点
经验
51552 点
帖子
702
精华
0
在线时间
4771 小时
注册时间
2009-5-22
最后登录
2024-4-25

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
执行以下一段代码:
  1. data a;
  2.    do i = 1 to 10;      
  3.    end;
  4.    output;
  5. run;

  6. proc print data=a;
  7. run;
复制代码
请问为何产生的数值不是10而是11?SAS工作的原理是怎样的?谢谢。
二维码

扫码加我 拉你入群

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

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

关键词:output outpu do循环 Out put

回帖推荐

liuchengxin 发表于5楼  查看完整内容

恩,实际上,按照我的理解,SAS program执行时,都是先compile,值是先读取到program data vector里去的,然后才会到execution; 在最后一步时,i=11,loop ends. 你用“有一个判断的动作“来理解,我觉得也可以吧。
已有 1 人评分热心指数 收起 理由
eijuhz + 1 奖励积极上传好的资料

总评分: 热心指数 + 1   查看全部评分

沙发
逍遥梦蝶 发表于 2017-12-14 18:43:29 |只看作者 |坛友微信交流群
从SAS Support Community上得到的解释如下。

DO-Loop中,遇到END会增加一个步长,然后返回DO语句,先判断是否在循环的区间内,如果是就继续,如果不是就停止。此例中,从1循环到10,到10之后继续下去碰到END,增加到11,返回到DO语句判断,不在1到10范围之内,停止循环,继而OUTPUT。因此,最后输出的值是11。

使用道具

藤椅
liuchengxin 学生认证  发表于 2017-12-14 21:32:02 |只看作者 |坛友微信交流群
data a;
   do i = 1 to 10;      
    output;
   end;
run;

proc print data=a;
run;

这样写,你就可以得到每一次迭代时的结果,最后一行是10.

                                                            Obs     i

                                                              1     1
                                                              2     2
                                                              3     3
                                                              4     4
                                                              5     5
                                                              6     6
                                                              7     7
                                                              8     8
                                                              9     9
                                                             10    10

你写的程序,其实那个output和没写一样,最后只输出一行结果
                                                            Obs     i

                                                             1     11
至于原理,简单来说,就是当这个index variable i变成11时,这个值超过了iteration do loop statement,所以迭代程序停止了,进行下一个statement.所以,print后,i是11.

使用道具

板凳
逍遥梦蝶 发表于 2017-12-14 21:52:36 |只看作者 |坛友微信交流群
liuchengxin 发表于 2017-12-14 21:32
data a;
   do i = 1 to 10;      
    output;
谢谢回复。是否可以理解为DO-Loop在顶部有一个判断的动作。

使用道具

报纸
liuchengxin 学生认证  发表于 2017-12-15 10:36:22 |只看作者 |坛友微信交流群
逍遥梦蝶 发表于 2017-12-14 21:52
谢谢回复。是否可以理解为DO-Loop在顶部有一个判断的动作。
恩,实际上,按照我的理解,SAS program执行时,都是先compile,值是先读取到program data vector里去的,然后才会到execution;
在最后一步时,i=11,loop ends.
你用“有一个判断的动作“来理解,我觉得也可以吧。

使用道具

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

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

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

GMT+8, 2024-4-26 12:19