Как использовать логический тип данных в 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;
выход:
для меня это не очень элегантная структура данных в качестве переменной 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;