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

8

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

输出:

这里输入图片描述

这里输入图片描述

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

是否有适用于上述is_fruit的布尔数据类型(或length类型)?


可以使用附加格式或 PROC DATASETS 命令添加扩展属性。 - Tom
2个回答

10

Base SAS只有两种数据类型:数值和字符。数值的长度可以从3个字节到8个字节不等,字符可以有任意长度(1个字节或更多)。

SAS中的布尔表达式等价于数值;0或缺失(空)值为“False”,任何其他值(负数或正数)为“True”。将SAS中布尔表达式的结果赋值给一个值会导致True1False0

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


8
如@Joe所解释的那样,SAS中只有两种数据类型:数字和字符。
每当遇到逻辑表达式时,SAS将产生True的值1和False的值0。
每当使用数值作为条件时,只有0和.被解释为False;其他所有数值等同于True。
逻辑表达式的示例:
* 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.

使用格式

您还可以进一步为布尔变量添加格式:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接