面试问题如下:set a b; 与 set a; set b; 都会有怎样的效果?
回答:
set a b; 就是纵向的拼接,如果有不同的变量,那相应位置就是空值。
set a; set b; 当时就有点虚,后来在群里跟sas兄弟讨论后得到答案如下:
变量数是A B 两个的总和,观测数是A,B中观测最少的那个。原理是 SET A B 一个指针一个pdv;set a;set b 两个指针,一个pdv。a的指针将数据集a的第一条观测读入PDV,b的指针将b的第一条观测读入pdv,然后输出,返回data步开头。以此类推。
比如a的观测少,a的指针先指向数据集a的末尾,由于a的指针已指向数据集a的末尾,固跳出data步。如果加上output还有一些结论,试一下很好理解了。
以下是测试的程序:
data a;
do a=1 to 10 by 2;
output;
end;
run;
data b;
do b=2 to 14 by 2;
output;
end;
run;
data c;
set a;
set b;
output; /*在此无影响*/
run;
data c;
set a;
output; /*b第一个观测为空,b的观测整体往下错了一位*/
set b;
run;
/*b第一个观测为空,a、b每个观测重复两遍(b第一个除外)*/
data c;
set a;
output;
set b;
output;
run;
以上是讨论结果,感谢指点我的兄弟!