堆叠数据集时出现意外结果

时间:2014-07-09 07:17:03

标签: sas

为什么堆叠两个数据集的以下两种替代方法的结果不同?

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'。

1 个答案:

答案 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变量所必需的。