在许多主流编程语言中,您可以使用布尔数据类型(例如,值可以是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
类型)?
答案 0 :(得分:9)
Base SAS只有两种数据类型:Numeric和Character。数字长度为3个字节到8个字节,字符有任意长度(1个字节或更多)。
SAS中的布尔表达式等同于数值; a 0或Missing(Null)值为“False”,任何其他值(负数或正数)为“True”。将SAS中布尔表达式的结果分配给值会导致1
True
和0
False
。
布尔值可以安全地存储在3长度数字中,或者如果真正关心空间,则可以转换为字符。 SAS针对8字节数字进行了优化,但除了存储空间之外,它并没有真正帮助缩短数字(在处理过程中内部将存储在8字节的RAM中)。
答案 1 :(得分:7)
正如@Joe所解释的那样,SAS中只有两种类型的数据,数字和字符。
每当遇到逻辑表达式时,SAS将为True生成值1,为False生成0。
每当使用数值作为条件时,只有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;