data a;
input z;
datalines;
2
;
run;
data b;
input x $ y;
datalines;
a 1
b 1
c 1
;
run;
data c;
set b;
if _n_=1 then set a;
run;
proc print data=c;
run;
那是因为你在第三个data用了if _n_=1 then set a;而将z的值在第三个data中的每一个循环保留下来而不变的!若将if _n_=1 then set a;改成if _n_=2 then set a;那就只能有两个循环保留下z的值。若将if _n_=1 then set a;改成if _n_=3 then set a;那就只能有最后一个循环保留下z的值。若将if _n_=1 then set a;改成if _n_=4 then set a;那就连最后一个循环也不能保留下z的值来。但你仍然引进了set a;而不保留任何z的值。
把数据集b中再添加变量z,然后运行,你就知道这个SET是怎样起作用的。
data a;
input z;
datalines;
2
;
run;
data b;
input x $ y z;
datalines;
a 1 4
b 1 3
c 1 5
;
run;
data c;
set b;
if _n_=1 then merge a;
run;
proc print data=c;
run;
两个set 的用法很奇特,系统分配两个指针,指向两个数据集,set 出来的结果的长度,是最短的那个数据集的长度,即哪个指针最先遇到最后一个观测,就完成。set a ;set b;会用b里面的数据集更新a的数据集(如果变量名相同);一般情况下,两个set 的用法是 if _n_=1 then set a;这种情况下,a一般是一个观测,另一种用法是
if _n_=1 then do until(last); set a end=last;var+varr1; end; 这种情况下,a可以是多条观测,但是 do untile 的结果 还是只有一条(最后那一条);