为什么堆叠两个数据集的以下两种替代方法的结果不同?
data work.a;
length ds $1;
ds = 'A';
do i = 1 to 3;
output;
end;
run;
data work.b;
length ds $1;
ds = 'B';
do i = 1 to 3;
do j = 1 to 3;
output;
end;
end;
run;
*- ALTERNATIVE 1 -*;
data work.c;
set work.a work.b;
if j = . then j = i;
run;
*- ALTERNATIVE 2 -*;
data work.d;
set work.a work.b;
run;
data work.d;
set work.d;
if j = . then j = i;
run;
我的猜测是数据集c和d都有j = i,其中ds ='A'。
答案 0 :(得分:2)
原因是通过SET语句读入变量的自动RETAIN。通过set语句读入的所有变量都保留在PDV中,直到SET的下一次迭代,其中替换了新值(来自set语句中的数据集)。
在编译期间,SET语句中数据集中的所有变量都在PDV中创建 在第一次执行迭代中,读取SET语句(work.a)中的第一个数据集,并将值1赋予i。变量j为null(。),因此逻辑条件为真,j变为1。 在第二次迭代中,i根据数据集work.a中的值替换为2,并且j未被替换(因为work.b未被读取) - 因此它被保留,因此它不为null,因此逻辑没有被执行。
有关更多示例,请参阅此sugi paper的示例3。它表明您可以通过简单地创建一个新变量来解决这个问题,如下所示:
data work.c;
set work.a work.b;
if j = . then XXX = i;
run;
RETAIN语句(相反)是保留未从SET语句中的数据集编译的NEW变量所必需的。