Я играю с 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
перед.
Обработка шага данных состоит из 2 фаз.
На этапе компиляции каждый из операторов на этапе данных сканируется на наличие синтаксических ошибок. На этапе выполнения создается часть данных набора данных.
Он инициализирует переменные отсутствующими и, наконец, выполняет другие операторы в порядке, определяемом их расположением на шаге данных.
В вашем случае оператор set идет после присваивания c
. В это время a
и b
установлены как отсутствующие, поэтому дается отсутствующее значение для c
. Наконец, оператор SET
будет выполнен, поэтому вы получите значение как для a
, так и для b
в первой строке.
data test;
set abcd.test_data;
c = a;
run;
Обратите внимание, что первой переменной в вашем наборе данных является c
, потому что это первая указанная в вашем коде.
Оператор INPUT выполняется в порядке, определяемом его положением на шаге данных. То же, что и любой другой исполняемый оператор.
@ Том Правильно, отредактировано.
Похоже, он действительно хотел, чтобы вы попросили его сделать это.
На первой итерации шага данных он установит C равным значению A. Значение A отсутствует, поскольку вы еще не присвоили ему никакого значения. Затем оператор SET прочитает первое наблюдение из вашего набора входных данных. Поскольку нет явного оператора OUTPUT, наблюдение записывается, когда итерация достигает конца.
На остальных итерациях шага данных значение, которое будет иметь A, когда оно будет присвоено C, будет значением последнего чтения из входного набора данных. Любая переменная, являющаяся частью входного набора данных, «сохраняется», что на самом деле просто означает, что она не будет отсутствовать при запуске новой итерации.
Если бы целью было создать C с предыдущим значением A, вы могли бы создать тот же результат, используя функцию LAG().
data test;
set abcd.test_data;
c=lag(a);
run;
Версия 7.11 НЕ является действительной версией SAS. Это может быть версия Enterprise Guide, которую вы используете для подключения к серверу SAS.