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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SAS中使用布尔数据类型?相关的知识,希望对你有一定的参考价值。

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

答案

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

SAS中的布尔表达式等同于数值; a 0或Missing(Null)值为“False”,任何其他值(负数或正数)为“True”。将SAS中的布尔表达式的结果赋值给1True0False

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

另一答案

正如@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

以上是关于如何在SAS中使用布尔数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

SAS中数据的导入(1)

如何有效地格式化SAS中多列的数据

如何使用 SAS 删除包含 SAS 数据集的外部文件夹

如何在SAS数据集中新加入变量

在读取SAS文件时,Pandas以正确的数据类型失败

如何在PROC SQL中使用MACRO在SAS中创建连续变量