SAS: добавление символьных переменных в шаге данных без предварительной установки длины - PullRequest
0 голосов
/ 16 апреля 2020

На шаге данных SAS, если кто-то создает символьную переменную, он должен быть осторожен при выборе правильной длины заранее. Следующий шаг данных возвращает неверный результат, когда var1 = case2, так как 'var2' усекается до 2 символов и равен 'ab', что, очевидно, не то, что мы хотим. То же самое происходит, заменив var2=' ' на length var2 $2. Процедуры такого типа весьма подвержены ошибкам.

 data b; set a; 
    var2 = '  ';
    if var1 = 'case1' then var2='xy';
    if var1 = 'case2' then var2='abcdefg';
run;

Мне не удалось найти способ просто определить 'var2' как символ, не заботясь о его длине (примечание: если не указано) длина 8). Знаете ли вы, если это возможно?

Если нет, то можете ли вы предложить более надежный оборот, что-то похожее на sql "case", "decode" и т. Д. c, для распределения различных значений новой строковой переменной, которая не страдает от этой проблемы длины?

1 Ответ

0 голосов
/ 16 апреля 2020

Код шага данных SAS является очень гибким по сравнению с большинством компьютерных языков (и, конечно, по сравнению с другими языками, созданными в начале 1970-х годов), поскольку вы не обязаны определять переменные перед их использованием. Компилятор шага данных ожидает определения переменной, пока не потребуется. Но, как и у любой компьютерной программы, у нее есть правила, которым она следует. Когда он не может ничего сказать о переменной, он определяется как цифра c. Если он видит, что переменная должна быть символьной, он принимает решение о длине переменной на основе информации, доступной в первой ссылке. Таким образом, если первое место, где вы используете переменную в своем коде, это присвоение ей строковой константы длиной 2 байта, тогда переменная имеет длину 2. Если это результат символьной функции, длина которой неизвестна, тогда длина по умолчанию равна 200. Если ссылка использует формат или информацию, то длина устанавливается равной длине, соответствующей ширине формата / информации. Если никакой дополнительной информации нет, длина составляет 8.

. Вы также можете использовать код PRO C SQL, если хотите. В этом случае правила ANSI SQL применяются для определения типов переменных.

В вашем конкретном примере назначение пропусков переменной не требуется, поскольку все вновь созданные переменные установлены как пропущенные (все пробелы) в случае символьных переменных), когда начинается итерация шага данных. Обратите внимание, что если VAR2 не является новым (ie, оно уже определено в наборе данных A), то вы все равно не сможете изменить его длину.

Поэтому просто замените оператор присваивания на оператор длины.

data b;
  set a; 
  length var2 $20;
  if var1 = 'case1' then var2='ab';
  if var1 = 'case2' then var2='abcdefg';
run;

На данном этапе SAS не собирается менять язык, у них слишком много пользователей с существующими базами кода. Возможно, в будущем они сделают новый язык.

...