【问题标题】:SAS Do loop over Set statementSAS Do 循环遍历 Set 语句
【发布时间】:2017-07-28 23:28:27
【问题描述】:

我有一个名为 test 的数据集,其中一个名为“id”的数值变量有 3 个观察值:

1
2
3

我正在使用 do 循环创建另一个,如下所示:

DATA abc;
 DO i = 1 to 3;
   SET test;
    m+1;
    OUTPUT;
 END;
RUN;

这将返回 3 个观察值。

如果我将 do loop 从 1 更改为 4 并删除输出语句,我会得到一个空数据集。我无法理解这一点。有人可以解释一下吗?

【问题讨论】:

  • 这似乎不是真的。日志说了什么?如果输入数据test 有 3 个观察值,即使您将 DO 循环的上限设置为 2,000,您的数据步骤也应该写入 3 个观察值。
  • @Tom 声明是正确的,您还有其他问题。您的“测试”数据集中的变量名称是什么?
  • 我刚刚更正了我的问题。如果我从 do 循环中删除输出语句,我会得到一个空数据集。循环1到4时,测试数据集中的变量名是'id'。我无法理解的是SET语句读取整个数据集,所以通过DO循环3次,我们应该不读取整个数据3次,得到9 次观察?

标签: sas


【解决方案1】:

大多数 SAS 数据步骤实际上在步骤执行 SET 或 INPUT 语句并发现没有更多可用输入时结束。这就是正在发生的事情。

SAS 通常在数据步迭代结束时写入观察结果。例外情况是当您有明确的 OUTPUT 语句编码时。因此,如果没有 OUTPUT 步骤,SAS 只会在数据步骤结束时写出观察结果。因此,当您修改 OUTPUT 时,您的步骤与以下内容相同:

DATA abc;
 DO i = 1 to 3;
   SET test;
    m+1;
 END;
 OUTPUT;
RUN;

但是,如果您的 DO 循环的迭代次数超过了 SET 语句要读取的观察次数,那么它将永远不会写完输出,因为它将读取到输入数据集的末尾并停止。

【讨论】:

  • 非常感谢.. 能不能请您和我建立一个聊天室,我只是想快速了解一些事情.. 另一个合适的时间也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 2017-07-24
  • 2017-10-31
相关资源
最近更新 更多