SAS 操作数据集的观测
SAS 操作数据集的观测
1. SAS表达式
表达式是操作数和操作符的序列,该序列会形成一组可执行并产生 结果值的指令。其中,操作数可以是常量、变量或表达式;操作符是表 示比较、数学计算或逻辑运算的符号,也可以是SAS函数或者括号组。 在SAS程序语句中,创建变量、赋值、求新值、转换变量和执行条件处理都会用到表达式。
1.操作数
操作数可以是常量、变量或表达式。SAS常量是表示一个固定值的 数字或字符串。常量可用作许多SAS语句的表达式,包括变量赋值语句 和IF-THEN语句,还可作为特定选项的值,例如OBS=5。SAS中存在4 类常量:字符常量、数字常量、时间日期常量和位测试常量。
(1)字符常量 字符常量由1到32767个字符组成,并且必须放在引号(单引号或双引号)中。在下面的SAS语句中,Tom是一个字符常量。
if name='Tom' then do;
如果字符常量包括单引号,则将该常量放入双引号中。例如,为了指定字符值Tom's,使用下面的形式:
if name="Tom's" then do;
或者将字符串放入单引号,并且用两个连续的单引号表示撇号。 SAS将两个连续的引号作为一个引号。例如,要表示字符串Tom's,则 使用下面的形式:
if name='Tom''s' then do;
要表示Tom“s,可以使用以下形式:
if name="Tom""s" then do;
注意 使用引号一定要匹配,否则会致使SAS误读当前的错误语
(2)数字常量 数字常量指的是SAS语句中出现的数字值。
(3)时间日期常量 在SAS中还可以创建日期常量、时间常量、时间日期常量。这些常量的形式为包含在单引号或双引号中的指定日期或时间,并接着跟随一 个d(日期)、t(时间)或dt(日期时间)来说明值的类型。例 如,'1jan2013'd、'9:25't、'01may12:9:30:00'dt。
(4)变量 变量是一组描述给定特性的数据值,可用于表达式中。 如果在一个表达式中指定了变量,但是变量值不匹配需要的类型,例如,在需要数值变量的地方使用了字符变量,或者相反,在需要字符 变量的地方使用了数值变量,SAS则会尝试将该变量值转换成所期望的 类型。SAS会按照如下规则自动在字符变量和数值变量之间转换:
·如果使用要求数字操作数的操作符(例如加号+)时指定了字符变 量,SAS将字符变量值转换为数字。
·在使用比较操作符比较字符变量和数值变量时,SAS会将字符变量 值转换为数字。
·如果使用要求字符操作数的操作符(例如级联操作符)时指定使用了数值变量,SAS使用格式BEST12.将数值变量值转换为字符。
·如果在赋值语句的左侧使用了数值变量而右侧是字符变量,SAS会 将字符变量值转换为数字。反之,当左侧是字符变量而右侧是数值变量 时,SAS会使用格式BESTn.将数值变量值转换为字符。其中,n是左侧 变量的长度。
当执行自动转换时,SAS会在日志中打印提示信息,表明发生了转 换。如果将字符变量值转换成数字时产生了无效的数字值,那么表达式 的结果是缺失值,并且会在日志窗口打印错误消息,同时,会将自动变 量_ERROR_设置为1。
2. 操作符
操作符包含算术操作符、比较操作符、逻辑操作符等,分别用于算 术运算、比较表达式和对布尔值进行操作等。此外,它还提供了一些只 能用于WHERE语句或WHERE=选项的操作符。
(1)算术操作符
使用算术操作符的表达式其运算结果是数值。表给出了算术操作符的定义、示例及示例表达式的计算结果。
算术操作符号

(2)比较操作符
使用比较操作符的表达式其运算结果是真(1)或假(0)。
比较操作符

在对数字值进行比较时,SAS会基于值进行比较。缺失数字值小于 任何其他数字值。表达式为真时,表达式的结果是1或真(true);表达 式为假时,表达式的结果是0或假(false)。比较操作符常用于IF- THEN语句中,如以下例子:
if x<y then c=;
else c=;
也可在赋值语句表达式中使用比较,例如:
c=*(x<y)+*(x>=y);
这时,SAS先计算括号内表达式(x<y)和(x>=y)的值(为0或1),然后使用计算结果替代括号里的表达式。因此,假设x=6,y=8, 那么赋值语句c=5*(1)+12*(0)的结果是c=5。
字符操作数的比较也会产生数字值1(或真)或0(或假)。SAS会 从左至右逐个字符对字符操作数进行比较。空格和缺失值小于其他任何 可打印字符值。字符顺序依赖于计算机的排列顺序,此顺序通常指的是在ASCII或EBCDIC编码中的顺序。例如在EBCDIC和ASCII的排列顺序中,G大于A。因此,表达式'Gray'>'Adams'的值为1或真。
如果是不同长度的两个字符值进行比较,在比较之前,SAS会假设 已经用空格补充到了较短的字符操作数结尾处,使两个字符值有了相同 的长度。在比较中尾缀空格会忽略,所以'fox'等于'fox'。然而,在字符值开始处和中间的空格都会参与比较,所以,'fox'不等于'fox'。
还可以在比较操作符之后使用“:”来比较字符表达式的指定前缀。 SAS会在比较过程中截断较长的值使其与较短值的长度一致。在下面的 例子中,在等于符号后面的冒号修改器告诉SAS仅查看变量LastName的 第一个字符是否为S。
if lastname=:'S';
(3)逻辑(布尔)操作符 使用逻辑操作符的表达式其运算结果是布尔值,即为真(1)或假(0)。下表给出SAS的逻辑操作符、等效字符、示例及其说明。
逻辑操作符

(4)其他操作符 在SAS表达式中还可以使用一些其他操作符,例如级联操作、括号等
*级联符号取决于当前操作环境。 在表达式,特别是包含多个操作符的复合表达式中,经常会将一些子表达式放入括号()中,表示优先对括号中的表达式求值,同时也会提高表达式的易读性。级联操作符||会将操作符两侧的字符值进行级联。通常会使用赋值语句将级联操作的结果存储在结果变量中。如果事先没有通过LENGTH或ATTRIB语句指定该结果变量的长度,则其长度为在级联操作中每个变量或常量的长度总和。级联操作不会去除操作数的前导和尾缀空格。如果变量带尾缀空 格,在级联前使用TRIM函数可去除值中的尾缀空格。如果要去除操作 数的前导和尾缀空格,通常使用表达式TRIM(LEFT(char))。

(5)WHERE语句操作符
在WHERE语句或数据集选项WHERE=中使用的表达式称为WHERE表达式。在WHERE表达式中除了可以使用上述操作符之外,还 可以使用如下表的操作符。注意,这些操作符只能在WHERE表达式中使用。

(6)MIN、MAX操作符
MIN(><)和MAX(<>)操作符分别用于找到两个操作数中的最 小值和最大值。例如,如果A<B,那么A><B的返回值为A,A<>B的返 回值为B。如果比较中包含缺失值,SAS使用缺失值的排序顺序。
注意,在WHERE语句或WHERE从句中,<>操作符等同于NE。
3.复合表达式求值
仅包含一个操作符的表达式为简单表达式。为了表示复杂的逻辑或 操作,表达式中通常会包含多个操作符,这样的表达式称为复合表达 式。复合表达式中经常使用括号对操作数进行分组。当遇到复合表达式 时,SAS会遵循下述规则确定计算表达式各部分的顺序:
·如果复合表达式中有括号,SAS会先对在括号中的表达式求值,再 对括号外的表达式求值。
·下表中给出了不同组的优先级。SAS先对组Ⅰ中的表达式部分求 值,然后依次对组Ⅱ、组Ⅲ等组求值。
·下表也给出了同组内的求值顺序。对组Ⅰ中的操作符是从右到 左,而其他组的操作符都是从左到右。
复合表达式求值顺序

①NOT、NE、OR以及组IV中的级联符号取决于当前操作环境。
SAS 操作数据集的观测的更多相关文章
- sas 获取数据集观测数量
DATA _NULL_;SET SASHELP.CLASS NOBS=N;CALL SYMPUTX('N',N);STOP;RUN; %PUT N=&N.; 运行结果: 57 DATA _NU ...
- SAS︱操作语句(if、do、select、retain、array)、宏语言、统计量、运算符号
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- SAS中的一些常见的符号.运算符是一种符号①比 ...
- SAS拆分数据集
2012年8月8日 主要是根据选取条件来进行拆分 1.根据行数来选: data test; set oldset; if _n_=10 then output; if id="001&quo ...
- 吴裕雄--天生自然 PYTHON语言数据分析:ESA的火星快车操作数据集分析
import os import numpy as np import pandas as pd from datetime import datetime import matplotlib imp ...
- SAS︱数据索引、数据集常用操作(set、where、merge、append)
代码部分大多来源于姚志勇老师的<SAS编程与数据挖掘商业案例>. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ ------------ ...
- SAS 选取部分观测
SAS 对部分观测得处理 在建立新数据集时,有以下两种方式可以从已经存在的数据集中选取观测到新数据集中. ·通过删除不满足条件的观测来保留想要的观测. ·仅接受满足条件的观测. 条件可以由IF语句. ...
- SAS进阶《深入解析SAS》之对多数据集的处理
SAS进阶<深入解析SAS>之对多数据集的处理 1. 数据集的纵向串接: 数据集的纵向串接指的是,将两个或者多个数据集首尾相连,形成一个新的数据集. 据集的横向合并: 数据集的横向合并,指 ...
- ThinkPHP 数据库操作(五) : 存储过程、数据集、分布式数据库
存储过程 5.0支持存储过程,如果我们定义了一个数据库存储过程 sp_query ,可以使用下面的方式调用: $result = Db::query('call sp_query(8)'); 返回的是 ...
- SAS 对数据的拼接与串接
SAS 对数据的拼接与串接 使用SAS对数据进行串接.合并.更新与修改. 1. 数据集的纵向串接 数据集的纵向串接指的是,将两个或者多个数据集首尾相连,形成 一个新的数据集. 对数据集的纵向串接可以通 ...
随机推荐
- c++多态及实现原理
https://www.cnblogs.com/cxq0017/p/6074247.html 通过虚函数实现,普通函数在编译过程中即确定了函数的地址,虚函数的函数地址是在程序运行的时候确定的,有虚函数 ...
- 【转】WPS word 文档中的插入对象 为什么打不开
点击桌面左下角开始按钮--所有程序,找到wps office文件夹--wps office工具--配置工具--高级--兼容设置,否选兼容第三方软件.
- [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(一) -- 安装jdk(含jre)及 MySql 5.6.39
[原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(一) -- 安装jdk(含jre)及 MySql 5.6.39 回老家已经有一段时间了, 四五线 ...
- 【第二组】Hunter——beta版发布文档
软件测试报告 一.bug情况汇总 尚需解决以及难以解决的: 登录时会有卡顿,需要加入加载进度条(会添加的) 商城和背包功能尚未实现(需要修复) 美工水平太差,让人没有使用的欲望(大概接下来就专门做这个 ...
- k8s Docker私有仓库认证
使用过K8s的小伙伴肯定会遇到一个问题,我们在使用自有的Docker仓库的时候都需要先登录用户名和密码,但是如果使用K8S怎么配置密码呢?在secret中有一个类型是docker-registry我们 ...
- Linux ansible 常用模块二
fetch 将远程机器上的文件拉取到本地,以ip或者主机名生成目录,并保留原来的目录结构 dest #目标地址src #源地址ansible web -m fetch -a "dest ...
- windows内核驱动内存管理之Lookaside使用
Windows内存管理中使用了类似于容器的东西,叫做Lookaside对象,每次程序员申请内存都会从Lookaside里面申请,只有不足的时候,Lookaside才会向内存又一次申请内存空间,这样减少 ...
- 【相关网站 - 01】- Java 相关网站
一.官方网站 1. Java 官方网站 https://www.java.com/zh_CN/ 2. Spring 官方网站 http://spring.io/ 1. Spring Framework ...
- win7旗舰版64位GHOST版的,安装telnet客户端时,提示:出现错误。并非所有的功能被成功更改。
win7旗舰版64位GHOST版的,安装telnet客户端时,提示:出现错误.并非所有的功能被成功更改. 从安装成功的电脑上拷贝ghost版本缺少的文件,然后再安装telnet客户端,我已打包 链接: ...
- 使用vue-cli@3启动elementui脚手架
[vue3.x] 准备看elementui的源码,早上拉elementui提供的脚手架代码,于是下载了vue3.x(之前一直用2.x) 1.先把vue2.x卸载了 npm uninstall -g v ...