Сервер SAS ведет себя странно

Я играю с 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. . (точка) приближается, и значения сдвигаются на строку в производном столбце.

Любая помощь?

Версия 7.11 НЕ является действительной версией SAS. Это может быть версия Enterprise Guide, которую вы используете для подключения к серверу SAS.

Tom 28.03.2022 20:28

Ты прав. Это Руководство по Предприятию.

Aakash Basu 29.03.2022 09:51
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
41
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваш оператор set находится после оператора присваивания переменной. SAS сначала пытается присвоить значение ac, которое еще не было прочитано. Сначала разместите оператор 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 выполняется в порядке, определяемом его положением на шаге данных. То же, что и любой другой исполняемый оператор.

Tom 28.03.2022 20:30

@ Том Правильно, отредактировано.

Kermit 28.03.2022 20:33
Ответ принят как подходящий

Похоже, он действительно хотел, чтобы вы попросили его сделать это.

На первой итерации шага данных он установит C равным значению A. Значение A отсутствует, поскольку вы еще не присвоили ему никакого значения. Затем оператор SET прочитает первое наблюдение из вашего набора входных данных. Поскольку нет явного оператора OUTPUT, наблюдение записывается, когда итерация достигает конца.

На остальных итерациях шага данных значение, которое будет иметь A, когда оно будет присвоено C, будет значением последнего чтения из входного набора данных. Любая переменная, являющаяся частью входного набора данных, «сохраняется», что на самом деле просто означает, что она не будет отсутствовать при запуске новой итерации.

Если бы целью было создать C с предыдущим значением A, вы могли бы создать тот же результат, используя функцию LAG().

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

Другие вопросы по теме