Как использовать логический тип данных в SAS?

во многих основных языках программирования Вы можете использовать логический тип данных (например, значение может быть либо true или false) - для представления двоичного "true/false".

есть ли логический тип данных в SAS тоже?

например, в этом коде переменная is_fruit предназначен для представления двоичных true (1) или false (0) ситуации. Поскольку я не знаю никаких булевых типов данных (или length types), я работаю вокруг этого, используя числовые:

data is_fruit;
    length fruit_name $ 40 is_fruit 8.;
    input fruit_name $ is_fruit;
    datalines;
apple 1
orange 1
car 0
tree 0
chicken 0
peach 1
mango 1
human 0
;

run;

выход:

enter image description here

enter image description here

для меня это не очень элегантная структура данных в качестве переменной is_fruit действительно логический тип данных (не числовой и не символьный). Итак, мой вопрос снова...

есть ли логический тип данных (или length type) для is_fruit выше?

2 ответов


Base SAS имеет только два типа данных: числовой и символьный. Числовой имеет длину от 3 байт до 8 байт возможно, символ имеет любую длину (1 байт или более).

логические выражения в SAS эквивалентны числовым значениям; 0 или отсутствующее (Null) значение - "False", любое другое значение (отрицательное или положительное) - "True". Назначение результата логического выражения в SAS значению приводит к 1 на True и 0 на False.

логические значения могут быть сохранены в 3 длины числовой безопасно или может быть преобразован в символ, если пространство действительно вызывает беспокойство. Однако SAS оптимизирован для 8-байтовых цифр, и, кроме места для хранения, это не помогает сократить числовое значение (внутренне во время обработки оно будет храниться в 8 байтах ОЗУ).


как объяснил @Joe, в SAS есть только 2 типа данных: числовые и символьные.

при встрече с логическим выражением SAS будет выдавать значения 1 для True и 0 для False.

при использовании числового значения в качестве условия, только 0 и . истолковываются как ложные; все остальные приравниваются к истинным.

примеры логических выражений:

* Parentheses are optional but make things clearer;

data logicalTest;
  a = (1 < 2);      * results in a = 1;
  b = (1 > 2);      * results in b = 0;
  c = (-10e20 > .); * results in c = 1;
  d = (. = .);      * results in d = 1;
run;

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


используя ограничения

если это необходимо, вы всегда можете добавить ограничения в таблицу, чтобы один или несколько столбцов могли принимать только значения 0 или 1. Например:

PROC SQL;
  create table logical 
   (id char (12) format=.,
    bool num format=1.);

  alter table logical
    add constraint boolean check(bool in (.,0,1))
      message = "Variable bool can only take values 0, 1, or null.";
QUIT; 

теперь, если мы попытаемся вставить несовместимые данные (последняя строка в примере ниже), мы получим сообщение об ошибке.

PROC SQL;
  insert into logical values ("ABC", 1);
  insert into logical values ("DEF", 0);
  insert into logical values ("GHI", .);
  insert into logical values ("JKL", null);
  insert into logical values ("JKL", 2);
QUIT;

Log показывает:

27         PROC SQL;
28           insert into logical values ("ABC", 1);
NOTE: 1 row was inserted into WORK.LOGICAL.

(...)

32           insert into logical values ("JKL", 2);
ERROR: Variable bool can only take values 0, 1, or null. Add/Update failed for data set WORK.LOGICAL because data value(s) do not 
       comply with integrity constraint boolean.
NOTE: This insert failed while attempting to add data from VALUES clause 1 to the data set.
NOTE: Deleting the successful inserts before error noted above to restore table to a consistent state.
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.

в формате

вы также можете пойти дальше и добавить формат в переменную bool:

PROC FORMAT;
  VALUE boolean 0 = "False"
                1 = "True"
                . = "Unknown";
QUIT;

PROC SQL;
  create table logical 
   (id char (12) format=.,
    bool num format=boolean.);

  alter table logical
    add constraint boolean check(bool in (.,0,1))
      message = "Variable bool can only take values 0, 1, or null.";
QUIT; 

PROC SQL;
  insert into logical values ("ABC", 1);
  insert into logical values ("DEF", 0);
  insert into logical values ("GHI", .);
  insert into logical values ("JKL", null);
QUIT;

"Boolean" field with format