SAS中output的运用

时间:2024-10-30 07:53:56

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号是不一致也是无关的。