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

Atl*_*as7 7 boolean sas data-structures

在许多主流编程语言中,您可以使用布尔数据类型(例如,值可以是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;
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

在此输入图像描述

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

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

Joe*_*Joe 9

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

SAS中的布尔表达式等同于数值; a 0或Missing(Null)值为"False",任何其他值(负数或正数)为"True".将SAS中的布尔表达式的结果分配给值会导致1for True0for False.

布尔值可以安全地存储在3长度的数字中,或者如果空间真的是一个问题,可以转换为字符.SAS虽然针对8字节数字进行了优化,但除了存储空间之外,它并没有真正帮助缩短数字(在处理过程中内部将存储在8字节的RAM中).


Dom*_*ois 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;
Run Code Online (Sandbox Code Playgroud)

如您所见,缺失值被视为数字,并且始终比任何数字都小.因此,在涉及缺失数据时,您需要谨慎比较值.


使用约束

如果这是您的需要,您可以始终向表添加约束,以便一个或多个列只能接受值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; 
Run Code Online (Sandbox Code Playgroud)

现在,如果我们尝试插入不兼容的数据(下面的示例中的最后一行),我们将收到一条错误消息.

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;
Run Code Online (Sandbox Code Playgroud)

日志显示:

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.
Run Code Online (Sandbox Code Playgroud)

使用格式

您还可以进一步向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;
Run Code Online (Sandbox Code Playgroud)

带有格式的