该数据集如何在后台运行?

时间:2017-07-20 10:13:25

标签: sas

我是SAS的初学者,想知道以下程序是如何从sashelp.class给我的第一个obs,在日志窗口中,它说数据因循环而停止。

有人可以解释一下,背景中发生了什么?

data test;
if age<14;
set sashelp.class;
run;

proc print;
run;

1 个答案:

答案 0 :(得分:1)

很棒的问题!了解DATA步骤的工作原理非常重要,其中一部分就是知道它何时停止。

DATA步骤停止的典型方式是SET语句尝试读取数据集中的下一条记录并命中文件的末尾。

步骤将停止的另一种方式是,如果它中有一个SET语句,它将执行DATA步骤循环的一次完整迭代而不执行SET语句。当它因此停止时,你会因为循环而停止&#34;信息。它基本上可以抵御无限循环。

查看您的代码,添加了一些PUT语句:

27   data test;
28     put "top of loop " _n_= age=;
29     if age<14;
30     set sashelp.class;
31     put "bottom of loop " _n_= age=;
32   run;

top of loop _N_=1 age=.
bottom of loop _N_=1 age=14
top of loop _N_=2 age=14
NOTE: DATA STEP stopped due to looping.
NOTE: There were 1 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK.TEST has 1 observations and 5 variables.

在循环的第一次迭代的顶部,age =。,所以if age<14为真。执行SET语句并读取第一条记录。在循环的底部年龄= 14。

在循环的第二次迭代(_n_=2)的顶部,age = 14,因为它会自动保留。子集化IF语句为false。控制进入循环的底部。 DATA步骤看到在循环的第二次迭代期间,没有读取任何记录。它会停止,并且由于循环而停止&#34;&#34;

如果将子集化IF更改为SET语句之后,则该步骤不会因循环而停止,因为在DATA步骤循环的每次迭代中都会读取一条记录。

33   data test;
34     put "top of loop " _n_= age=;
35     set sashelp.class;
36     if age<14;
37     put "bottom of loop " _n_= age=;
38   run;

top of loop _N_=1 age=.
top of loop _N_=2 age=14
bottom of loop _N_=2 age=13
top of loop _N_=3 age=13
bottom of loop _N_=3 age=13
top of loop _N_=4 age=13
top of loop _N_=5 age=14
top of loop _N_=6 age=14
bottom of loop _N_=6 age=12
top of loop _N_=7 age=12
bottom of loop _N_=7 age=12
top of loop _N_=8 age=12
top of loop _N_=9 age=15
bottom of loop _N_=9 age=13
top of loop _N_=10 age=13
bottom of loop _N_=10 age=12
top of loop _N_=11 age=12
bottom of loop _N_=11 age=11
top of loop _N_=12 age=11
top of loop _N_=13 age=14
bottom of loop _N_=13 age=12
top of loop _N_=14 age=12
top of loop _N_=15 age=15
top of loop _N_=16 age=16
bottom of loop _N_=16 age=12
top of loop _N_=17 age=12
top of loop _N_=18 age=15
bottom of loop _N_=18 age=11
top of loop _N_=19 age=11
top of loop _N_=20 age=15
NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK.TEST has 10 observations and 5 variables.