Как использовать 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;
![" Булево]()