output的用法,如下程序,set salary后不加output时,set读取一行观测时不会输出,只有当遇见后面的output时才会输出。
data test_data;
set salary;
if _n_ = 8 then do;
x1='飞哥';
x2='男';
output;
end;
run;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
输出结果只有一行。如果去掉output结果就是全部。
data test_data;
set s;
output;
if _n_ = 8 then do;
call missing(of _all_);
x1='飞哥';
x2='男';
output;
set s(firstobs=4 obs=6) ;
put _n_=;
output;
end;
if _n_=9 then do;
set s ;
output;
end;
run;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
通过运行这段程序发现,一个set语句对应一个 _N_变量,各自有各自的行指针变量互相不影响。但是_n_还是跟随最开始的set语句的变量。
s读取到第八行执行。
x1=‘飞哥’;x2=‘男’;。相当于插入一行,利用output输出。接着输出set s(firstobs=4 obs=6) ;,就是第十行的数据。这个s的指针n2=4。
此时N1=8,所以不执行if=9.当n1=9时。先把s的第九行输出,看见的序号就是s的第九行。继续执行set s。此时并不从n2=4,或者n2=5,也不执行n1=9。而是给set s重新分配了n3=1。
data test_data;
set s;
output;
if (_n_ = 8) or (_N_=9) then do;
call missing(of _all_);
x1='飞哥';
x2='男';
output;
set s(firstobs=4 obs=6) ;
put _n_=;
output;
end;
run;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
这段代码证明了,set指针是分开的,n是不可更改的。第一次先从第四行读取,第二次再接着读第五行。
_N_这玩意第一次写入后便不会被更改,估计是编译的时候就确定好了。
总结:行指针_N_遵循第一个set。每一个set语句都会重新分配单独的_N_.SAS玩来玩去就是玩指针顺序。再加一点,_N_变量和最后写入数据集的obs号是不一致也是无关的。