【问题标题】:Unexpected result when stacking datasets [duplicate]堆叠数据集时出现意外结果[重复]
【发布时间】:2014-07-09 07:17:03
【问题描述】:

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

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 where ds = 'A'。

【问题讨论】:

    标签: sas


    【解决方案1】:

    原因是通过 SET 语句读入的变量会自动保留。通过 set 语句读入的所有变量都保留在 PDV 中,直到 SET 的下一次迭代,其中新值(来自 set 语句中的数据集)被替换。

    在编译期间,SET 语句中数据集中的所有变量都在 PDV 中创建。
    在执行的第一次迭代中,读取 SET 语句 (work.a) 中的第一个数据集,并将值 1 赋予 i。变量 j 为空 (.),因此逻辑条件为真,j 变为 1。 在第二次迭代中,根据数据集 work.a 中的值将 i 替换为 2,并且不替换 j(因为未读取 work.b)-因此它被保留,因此它不为空,因此逻辑不执行。

    更多示例,请参见sugi paper 的示例 3。它表明您可以通过简单地创建一个新变量来解决此问题,如下所示:

    data work.c;
        set work.a work.b;
        if j = . then XXX = i;
    run;
    

    RETAIN 语句(相比之下)对于保留不是从 SET 语句中的数据集编译的新变量是必需的。

    【讨论】:

      猜你喜欢
      • 2012-08-25
      • 1970-01-01
      • 2021-03-06
      • 2013-09-24
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多