SAS  对部分观测得处理

在建立新数据集时,有以下两种方式可以从已经存在的数据集中选取观测到新数据集中。

  ·通过删除不满足条件的观测来保留想要的观测。

  ·仅接受满足条件的观测。

条件可以由IF语句、WHERE语句或数据集选项WHERE=中的条件表达式来指定。WHERE语句和数据集选项WHERE=可以用在DATA步 和PROC步中,两者的使用方法基本相同。

1.使用DELETE语句删除满足条件的观测

在DATA步中可以结合使用IF语句和DELETE语句来删除满足条件 的观测,其基本形式如下:

IF  条件表达式  THEN  DELETE;

在该过程中,SAS首先判断条件表达式是否为真。如果为真,则执 行THEN从句中的DELTET语句。DELETE语句会让SAS立即返回DATA 步的开始处读取下一条观测,当前观测不会写入输出数据集中。注意, DELETE语句不会删除输入数据集中的观测。

在数据集saslib.contact中选取地址信息(Address)不为缺失 值的观测建立新数据集work.contact_address。

已经存在的数据集saslib.contact中包含客户联系信息,内容如图所示。

在DATA步中IF语句用于判断Address信息是否为缺失值,DELETE语句则可将Address为缺失值的观测删除。代码如下:

data  work.contact_address;
set saslib.contact;
if address = "" then delete;
run;
proc print data=work.contact_address;
run;

PRINT过程打印的数据集work.contact_address如图3.5所示。其中不 包含编号(Customer_ID)为C004的客户信息,因为其地址信息为缺失 值。

2.使用取子集的IF语句接受满足条件的观测

选择满足条件的观测另一种方式是直接选取满足条件的观测,即使 用取子集的IF语句(Subsetting IF),其基本形式如下:

IF  条件表达式;

当条件表达式的值为真时,继续处理该观测;否则停止处理该观测 并返回DATA步开始处读取下一条观测,且该观测不会写入输出数据 集。该IF语句称为选取子集的IF语句,是因为所产生的输出数据集是原 始数据集的子集。

选取数据集saslib.contact中其职位(Position)为Manager的 观测,建立新数据集work.contact_manager,并打印新生成的数据集中的数据。

代码如下:

data  work.contact_manager;
set saslib.contact;
if position = "Manager";
run;
proc print data=work.contact_manager noobs;
run;

DELETE语句和取子集的IF语句得选择主要依据:

  ·由于DELETE语句和取子集的IF语句需要构造的条件表达式不同, 因此在编写程序的时候,通常选择需要较少比较次数的条件表达式的语句,因为这会提高程序执行效率。

  ·在比较次数相近时,通常选择正向的条件表达式,也就是说选择 取子集的IF语句。

  ·当数据中存在缺失值或可能有拼写错误的数据值时,使用取子集 的IF语句也更容易产生需要的结果。

3. 使用OUTPUT语句建立多个数据集

结合条件语句和OUTPUT语句可以在一个DATA步中创建多个SAS数据集,以便分别包含输入数据集的不同观测。使用OUTPUT语句的基本形式如下:

OUTPUT  <数据集>;

OUTPUT语句将当前观测写入指定数据集。其数据集必须为在 DATA语句中出现的数据集。当未指定数据集时,SAS会将当前观测写入DATA语句的所有数据集中。

选取在数据集saslib.contact中选取职位(Position)为 Manager的观测,建立新数据集work.contact_manager,对其他职位的观 测建立新的数据集work.contact_others。

代码如下:

data  work.contact_manager work.contact_others;
set saslib.contact;
if position = "Manager" then output work.contact_manager;
else output work.contact_others;
run;
proc print data=work.contact_manager noobs;
title "Postion is Manager";
run;
proc print data=work.contact_others noobs;
title "Postition is not Manager";
run;

  如果在DATA步中不使用任何OUTPUT语句,在每次迭代结束时会自动将观测写入DATA语句指定的所有数据集中。但是,如果在DATA 步中使用了OUTPUT语句,每次迭代结束时就不会自动将观测写入任何 数据集。因此,一旦在程序使用了OUTPUT语句,则必须为所有需要写 入数据集的观测使用OUTPUT语句。此外,还需要注意的是,如果在 OUTPUT语句之后进行计算,生成或改变的变量值也不会写入输出数据集。

  在saslib.contact中选取职位(Position)为Manager的观测输 出到数据集work.contact_manager中,并将年龄(Age)大于等于35的联 系人的观测输出到数据集work.contact_agege35中。代码如下:

data  work.contact_manager work.contact_agege35;
set saslib.contact;
if position = "Manager" then output work.contact_manager;
if age >= then output work.contact_agege35;
run;
proc print data=work.contact_manager noobs;
title "Position is Manager";
run;
proc print data=work.contact_agege35 noobs;
title "Age is older than 35";
run;

  PRINT语句打印的两个数据集内容如图3.8所示。其中Customer_ID 为C001的观测同时存在于两个数据集work.contact_manager和 work.contact_agege35中,因为其同时满足两个IF语句的条件。

4  操作所选取的观测

  除了将满足条件的观测值直接写入结果数据集外,在DATA步中还 可以操作满足条件的观测中的变量值,例如修改变量名字以及生成新变量等。

4.1   IF-THEN/ELSE语句

SAS选取观测进行操作时,最常用的方式是通过IF-THEN/ELSE语句。其基本形式如下:

IF  条件表达式  THEN  可执行语句;
<ELSE 可执行语句;>

其中:

  • ·条件表达式是一个或多个SAS表达式,通常为由比较操作符和操作 数组成的表达式。
  • ·SAS会对条件表达式的求值,结果为真(true)时,执行THEN从 句中的可执行语句;条件表达式的值为假(false)时,SAS忽略THEN 从句。可执行语句必须是在DATA步的单次迭代中可以执行的SAS语 句。最常用的可执行语句是赋值语句。
  • ·ELSE从句提供对该观测的可选操作。当条件表达式为真(true) 时忽略该从句;为假(false)时,执行ELSE从句中指定的语句。ELSE 从句可以不存在,如果存在则必须紧跟在对应的IF-THEN语句之后。

在saslib.inventory中包含了产品在各地区的库存和价格信 息。公司现决定将每种产品在北京的销售价格提高20%,其他地区保持 不变。

代码如下:

data  work.Inventory2;
set saslib.Inventory;
if Region="BJ" then Price=Price*1.2;
run;
proc print data=work.Inventory2 noobs;
run;

公司决定将每种产品在北京的销售价格提高20%,其他地区 销售价格提高10%。这时可使用ELSE从句,代码如下:

data  work.Inventory3;
set saslib.Inventory ;
if Region="BJ" then Price=Price*1.2;
else Price=Price*1.1;
run;
proc print data=work.Inventory3 noobs;
run;

4.2 赋值语句

赋值语句是可执行语句,常用于对变量进行赋值。其基本形式为:

变量=表达式;

其中:

  • ·变量是已经存在的变量或新变量,可以是单个变量名、数组引用 或左侧的SUBSTR函数(即SUBSTR函数出现在赋值操作符左侧)等。 若变量已经存在,赋值语句会修改该变量的值;如果变量不存在,赋值 语句会创建新变量。
  • ·表达式是任何SAS表达式。

赋值语句用于对等号(=)右侧的表达式求值,并将结果存储在等 号(=)左侧的变量中。表达式中可包含出现在等号左侧的变量。这 时,变量的原始值用于对表达式求值,并且结果存储在等号左侧的变量 中。

在例3.8中,使用了赋值语句(Price=Price*1.2;)提高产品价格。 在处理第一条观测时,输入数据集中的Price值为125,对表达式 Price*1.2求值,结果为150,因为左侧变量为Price,所以结果仍然存储 在Price中。因此,输出数据集中Price的值为150。

4.3 DO语句

DO语句也是可执行语句。通过DO语句可以将一组可执行语句指定 为一个单元来执行。DO语句的基本形式如下:

DO;
…可执行语句组…;
END;

在DO语句和END语句之间的语句称为DO组(DO Group)。DO语 句也可以嵌套DO语句。在IF-THEN/ELSE语句中,简单的DO语句通常 用于根据IF条件是否为真来指定要执行的一组可执行语句。

例:基于数据集saslib.Inventory中的数据,将每种产品在北京的销售价格提高20%,库存增加1倍,其他地区的销售价格提高10%,库存 增加50%。

这时在IF语句THEN从句和ELSE从句中使用DO语句,代码如下:

data  work.Inventory4;
set saslib.Inventory;
if Region="BJ" then do;
Price=Price*1.2;
Instock=Instock*;
end;
else do;
Price=Price*1.1;
Instock=Instock*1.5;
end;
run;
proc print data=work.Inventory4 noobs;
run;

PRINT过程打印价格所生成的数据集内容如图所示。

4.4.嵌套IF-THEN/ELSE语句

一条IF-THEN/ELSE语句可根据条件提供两种不同的可选操作。很多时候需要根据一系列互斥的条件执行不同的操作,这时可使用嵌套的 IF-THEN/ELSE语句。两层嵌套的IF-THEN/ELSE语句的基本形式如下:

IF  条件表达式1  THEN  可执行语句1;
ELSE IF条件表达式2 THEN可执行语句2;
ELSE可执行语句3;

其执行过程如下:

1)SAS计算条件表达式1的值。

2)当条件表达式1的结果为真时,SAS执行可执行语句1,并忽略 紧跟其后的ELSE从句,包括嵌套的IF-THEN/ELSE语句。所有执行过程 完成。

3)当条件表达式1的结果为假时,忽略紧跟其后的THEN从句,并 进行下一步。

4)判断SAS条件表达式2的值。

5)当条件表达式2的结果为真时,SAS执行可执行语句2,并忽略紧跟其后的ELSE。所有执行过程完成。

6)当条件表达式1的结果为假时,忽略紧跟其后的THEN从句,SAS执行可执行语句3。所有执行过程完成。

基于数据集saslib.Inventory中的数据,公司决定将每种产品 在北京的销售价格提高20%,在上海的销售价格提高15%,其他地区的 销售价格提高10%。

data  work.Inventory5;
set saslib.Inventory;
if Region="BJ" then
Price=Price*1.2;
else if Region="SH" then
Price=Price*1.15;
else
Price=Price*1.1;
run;
proc print data=work.Inventory5 noobs;
run;

4.5  SELECT语句

还可以通过SELECT语句构造不同的条件来操作观测。SELECT语 句的基本形式如下:

SELECT  <select-表达式>;
WHEN when-表达式 可执行语句;
<…WHEN when-表达式 可执行语句; >
<OTHERWISE 可执行语句;>
END;
  • ·select-表达式指定计算单个值的SAS表达式。
  • ·when-表达式为任意SAS表达式。在SELECT语句和END语句之间的语句称为SELECT组。SELECT组中要求至少有一条WHEN语句,而WHEN语句中要求至少有一个when-表达式。when-表达式为真时,执行 跟随其后的可执行语句;否则,忽略其后可执行语句。
  • ·可执行语句可以是任何可执行的SAS语句,包括赋值语句、DO语 句、SELECT语句或空语句等。空语句用于WHEN语句中时,SAS会认 为该条件为真,但是不做任何操作。
  • ·OTHERWISE从句中指定当所有的WHEN条件都不满足时需要执行 的语句。

将公司每种产品在北京的销售价格提高20%,在上海的销售价格提高15%,其他地区的销售价格提高10%。 使用SELECT语句的代码如下:

data  work.Inventory6;
set saslib.Inventory;
select (Region);
when ("BJ") Price=Price*1.2;
when ("SH") Price=Price*1.15;
otherwise Price=Price*1.1;
end;
run;
proc print data=work.Inventory6 noobs;
run;

SAS 选取部分观测的更多相关文章

  1. sas 获取数据集观测数量

    DATA _NULL_;SET SASHELP.CLASS NOBS=N;CALL SYMPUTX('N',N);STOP;RUN; %PUT N=&N.; 运行结果: 57 DATA _NU ...

  2. SAS笔记

    SAS基础知识 SAS里面的PROC一览 The ACECLUS Procedure : 聚类的协方差矩阵近似估计(approximate covariance estimation for clus ...

  3. SAS基础 -- SAS编程入门

    SAS语言 -- 简介   SAS语言是一种专用的数据管理与分析语言,它提供了一种完善的编程语言.类似于计算机的高级语言,SAS用户只需要熟悉其命令.语句及简单的语法规则就可以做数据管理和分析处理工作 ...

  4. SAS之大话PDV

    SAS之大话PDV 之所以说是数据源,而非输入缓冲区的原因上一条推送已经说明,这里就不再啰嗦啦. 这里我们且将DATA步流程简单地分为从数据源读入到pdv和从pdv写入数据集. IF语句 & ...

  5. 逻辑回归--美国挑战者号飞船事故_同盾分数与多头借贷Python建模实战

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  6. SAS 操作数据集的观测

    SAS  操作数据集的观测 1. SAS表达式 表达式是操作数和操作符的序列,该序列会形成一组可执行并产生 结果值的指令.其中,操作数可以是常量.变量或表达式:操作符是表 示比较.数学计算或逻辑运算的 ...

  7. SAS 按自定义顺序对观测进行排序

    本文链接:https://www.cnblogs.com/snoopy1866/p/15091967.html 实际项目中会经常遇到按指定顺序输出Listing的情况,例如:输出所有受试者的分组情况列 ...

  8. SAS对数据变量的处理

    SAS对数据变量的处理 在使用DATA步基于已经存在的数据集生成新数据集时,可以指定在新数据集中不需要包含的变量而仅读取其他变量,或者指定仅需要在 新数据集中包含的变量.该功能可以通过DATA步中的S ...

  9. SAS实验室之PROC TRANSPOSE

    首先,抛开SAS,回忆我们在数学课本上学习的转置是什么概念,转置如下图: 以上就是数学中的转置. 那么在SAS里该如何转置呢? 先看语法格式: PROC TRANSPOSE <DATA=inpu ...

随机推荐

  1. 前端笔记-jquery

    一.什么是jquery 1.jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team 2.jQuery是继prototype之后又一个优秀的 ...

  2. vue-cli 报Module build failed: Error: No parser and no file path given, couldn't infer a parser.错的解决方法

    出错提示如下: ERROR Failed to compile with errors :: error in ./src/App.vue Module build failed: Error: No ...

  3. SSM商城项目(十三)

    1.   学习计划 1.订单系统 2.提交订单 3.MyCAT 2.   订单系统 2.1. 功能分析 1.在购物车页面点击“去结算”按钮跳转到订单确认页面. a)         展示商品列表 b) ...

  4. Game Engine Architecture 5

    [Game Engine Architecture 5] 1.Memory Ordering Semantics These mysterious and vexing problems can on ...

  5. mysql判断表里面一个逗号分隔的字符串是否包含单个字符串、查询结果用逗号分隔

    1.mysql判断表里面一个逗号分隔的字符串是否包含单个字符串 : FIND_IN_SET select * from tablename where FIND_IN_SET(传的参数,匹配字段) 例 ...

  6. 总结一下我的dmp第一个版本 也是最后一个版本

      刚刚接手了一个新项目-DMP,目前已经开发联调完成,等待测试上线,所以现在来总结一下. 本来是一个前辈在负责,四月底离职了,他离职前我花了一周把这个项目交接了过来,大致熟悉了项目的业务流程以及代码 ...

  7. SpringBoot集成MyBatis的分页插件 PageHelper

    首先说说MyBatis框架的PageHelper插件吧,它是一个非常好用的分页插件,通常我们的项目中如果集成了MyBatis的话,几乎都会用到它,因为分页的业务逻辑说复杂也不复杂,但是有插件我们何乐而 ...

  8. node.js 从入门到。。。

    本人安装环境为 mac ,所以只记录了 mac 下的操作步骤 1.安装 node node的国内下载地址:http://nodejs.cn/download/ 安装之后,在终端输入指令 node -v ...

  9. Vue中 $ref 的用法

    说明:vm.$refs 一个对象,持有已注册过 ref 的所有子组件(或HTML元素)使用:在 HTML元素 中,添加ref属性,然后在JS中通过vm.$refs.属性来获取注意:如果获取的是一个子组 ...

  10. java中实现对list的模糊查询

    比如我有下面这样一个List,里面存放的是多个Employee对象.然后我想对这个List进行按照Employee对象的名字进行模糊查询.有什么好的解决方案么?比如我输入的查询条件为“wang”,那么 ...