Как использовать логический тип данных в SAS?
Во многих основных языках программирования вы можете использовать логический тип данных (например, значение может быть true
или же false
) - для представления двоичного "истина / ложь".
Есть ли в SAS логический тип данных?
Например, в этом коде переменная is_fruit
предназначен для представления двоичного true
(1) или false
(0) ситуация. Поскольку я не знаю ни о каких булевых типах данных (или length
типы), я работаю над этим, используя числовые:
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
действительно логический тип данных (не числовой и не символьный). Итак, мой вопрос снова...
Есть ли логический тип данных (или length
тип) для is_fruit
выше?
2 ответа
Базовый SAS имеет только два типа данных: числовой и символьный. Числовое значение имеет длину от 3 до 8 байтов, длина символа - от 1 до более.
Булевы выражения в SAS эквивалентны числовым значениям; значение 0 или Missing (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=$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;