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, ,
奇怪的事情:
- 派生变量总是在右边生成,这个在左边生成。
- 。 (点)即将到来,值在派生列中移动一行。
有什么帮助吗?
您的 set
语句在您的变量赋值语句之后。 SAS 首先尝试将 a
的值赋给 c
,但尚未读取。首先放置您的 set
语句,然后进行变量操作。
data test;
set abcd.test_data;
c = a;
run;
这里没有什么奇怪的,只是把SET
语句放在前面。
Datastep 处理包含 2 个阶段。
- 编译阶段
- 执行阶段
在编译阶段,数据步骤中的每个语句都会被扫描以查找语法错误。
在执行阶段,创建数据集的数据部分。
它将变量初始化为 missing 并最终按照它们在数据步骤中的位置确定的顺序执行其他语句。
在您的例子中,set 语句出现在 c
的赋值之后。当时 a
和 b
被设置为缺失,因此为 c
提供了缺失值。最后,SET
语句将被执行,这就是为什么您最终在第一行得到 a
和 b
值的原因。
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;
我正在玩 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, ,
奇怪的事情:
- 派生变量总是在右边生成,这个在左边生成。
- 。 (点)即将到来,值在派生列中移动一行。
有什么帮助吗?
您的 set
语句在您的变量赋值语句之后。 SAS 首先尝试将 a
的值赋给 c
,但尚未读取。首先放置您的 set
语句,然后进行变量操作。
data test;
set abcd.test_data;
c = a;
run;
这里没有什么奇怪的,只是把SET
语句放在前面。
Datastep 处理包含 2 个阶段。
- 编译阶段
- 执行阶段
在编译阶段,数据步骤中的每个语句都会被扫描以查找语法错误。
在执行阶段,创建数据集的数据部分。
它将变量初始化为 missing 并最终按照它们在数据步骤中的位置确定的顺序执行其他语句。
在您的例子中,set 语句出现在 c
的赋值之后。当时 a
和 b
被设置为缺失,因此为 c
提供了缺失值。最后,SET
语句将被执行,这就是为什么您最终在第一行得到 a
和 b
值的原因。
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;