Как использовать Boolean datatype в SAS?

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

Есть ли также булевский тип данных в SAS?

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

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;

Вывод:

введите описание изображения здесь

введите описание изображения здесь

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

Существует ли тип Boolean типа данных (или length) для is_fruit выше?

Ответ 1

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

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

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

Ответ 2

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

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

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

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

* 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=$12.,
    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;

Журнал показывает:

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=$12.,
    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;

" Булево