SAS 服务器行为异常

SAS Server behaving strangely

我正在玩 SAS(版本:7.11 HF2),我有一个包含 A 列和 B 列的数据集,变量 A 是十进制的。当我 运行 下面的代码时,奇怪的是我得到了一个 . (点)在输出的第一行。

输入数据:

a,        b
2.4,      1
1.2,      2
3.6,      3

代码:

data test;
    c = a;
    set abcd.test_data;
run;

输出数据:

c,    a,        b
.,    2.4,      1
2.4,  1.2,      2
1.2,  3.6,      3
3.6,     ,       

奇怪的事情:

  1. 派生变量总是在右边生成,这个在左边生成。
  2. 。 (点)即将到来,值在派生列中移动一行。

有什么帮助吗?

您的 set 语句在您的变量赋值语句之后。 SAS 首先尝试将 a 的值赋给 c,但尚未读取。首先放置您的 set 语句,然后进行变量操作。

data test;
    set abcd.test_data;
    c = a;
run;

这里没有什么奇怪的,只是把SET语句放在前面。

Datastep 处理包含 2 个阶段。

  • 编译阶段
  • 执行阶段

在编译阶段,数据步骤中的每个语句都会被扫描以查找语法错误。
在执行阶段,创建数据集的数据部分。

它将变量初始化为 missing 并最终按照它们在数据步骤中的位置确定的顺序执行其他语句。

在您的例子中,set 语句出现在 c 的赋值之后。当时 ab 被设置为缺失,因此为 c 提供了缺失值。最后,SET 语句将被执行,这就是为什么您最终在第一行得到 ab 值的原因。

data test;
    set abcd.test_data;
    c = a;
run;

请注意,您的数据集中的第一个变量是 c,因为这是您的代码中第一个声明的。

看起来它确实希望你要求它这样做。

在数据步骤的第一次迭代中,它将 C 设置为 A 的值。A 的值缺失,因为您还没有给它任何值。然后 SET 语句将从您的输入数据集中读取第一个观察值。由于没有明确的 OUTPUT 语句,因此在迭代结束时写入观察结果。

在数据步骤的其余迭代中,A 在分配给 C 时所具有的值将是最后一次从输入数据集中读取的值。作为输入数据集一部分的任何变量都会被“保留”,这实际上只是意味着在新的迭代开始时它不会被设置为缺失。

如果目标是使用 A 的先前值创建 C,您可以使用 LAG() 函数创建相同的输出。

data test;
  set abcd.test_data;
  c=lag(a);
run;