如何在SAS中使用布尔数据类型?

时间:2016-05-19 15:57:22

标签: data-structures sas boolean

在许多主流编程语言中,您可以使用布尔数据类型(例如,值可以是truefalse) - 来表示二进制“真/假”。

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;

输出:

enter image description here

enter image description here

对我来说,这不是一个非常优雅的数据结构,因为变量is_fruit实际上是一个布尔数据类型(不是数字或字符)。所以我的问题又来了......

上面的length是否有布尔数据类型(或is_fruit类型)?

2 个答案:

答案 0 :(得分:9)

Base SAS只有两种数据类型:Numeric和Character。数字长度为3个字节到8个字节,字符有任意长度(1个字节或更多)。

SAS中的布尔表达式等同于数值; a 0或Missing(Null)值为“False”,任何其他值(负数或正数)为“True”。将SAS中布尔表达式的结果分配给值会导致1 True0 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;

"Boolean" field with format