《深入解析sas:数据处理、分析优化与商业应用》一3.1 选取部分变量

简介:

本节书摘来自华章出版社《深入解析sas:数据处理、分析优化与商业应用》一书中的第3章,第3.1节,作者 夏坤庄 徐唯 潘红莲 林建伟,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.1 选取部分变量

在使用DATA步基于已经存在的数据集生成新数据集时,可以指定在新数据集中不需要包含的变量而仅读取其他变量,或者指定仅需要在新数据集中包含的变量。该功能可以通过DATA步中的SET语句和数据集选项KEEP=和DROP=来实现,也可以通过KEEP和DROP语句来实现。
1.?使用数据集选项KEEP=和DROP=
使用数据集选项KEEP=和DROP=的基本形式如下:

DATA 新数据集;
    SET 原数据集 (KEEP | DROP=变量列表);
RUN;

在该过程中,DATA步通过读取原数据集的部分变量来建立新数据集。新数据中包含的变量由所使用的选项(KEEP=或DROP=)给出的变量列表确定。使用选项KEEP=表示只读取变量列表中的变量,而使用选项DROP=则表示读取除变量列表中列出的变量之外的其他所有变量。
例3.1:读取数据集sashelp.shoes中与产品销售相关的变量Product、Stores和Sales,建立新数据集。
代码如下:

data work.shoes_part1;
    set sashelp.shoes (keep=Product Stores Sales);
run;

proc print data=work.shoes_part1 (obs=5) noobs;
run;

在上面的代码中,SET语句使用数据集选项KEEP=指定的Product、Stores和Sales。PROC PRINT打印所生成的数据集work.shoes_part1的前5条观测,如图3.1所示。可以看到,该数据集中包含了变量Product、Stores和Sales。
下面使用数据集选项DROP=来实现相同的功能,代码如下:

data work.shoes_part2;
    set sashelp.shoes (drop=Region Subsidiary Inventory Returns);
run;

因为sashelp.shoes的变量包含Product、Stores、Sales、Region、Subsidiary、Inventory和Returns,所以当选项DROP=中指定了Region、Subsidiary、Inventory和Returns时,剩下的变量Product、Stores和Sales都会被读取并写入数据集work.shoes_part2。所生成的数据集work.shoes_part2和前面示例中生成的work.shoes_part1相同。
简单来说,选择使用选项KEEP=还是DROP=依赖于哪种方法会需要指定较少的变量。但相比较而言,使用选项KEEP=会明确指明需要读取的变量,这样在比较大的作业中可以避免读取预期之外的变量。
2.?使用KEEP和DROP语句
在DATA步中,KEEP和DROP语句同样可用于选取写入到新数据集中的变量。使用DROP和KEEP语句的基本形式如下:

DATA 新数据集;
    SET 原数据集;
    KEEP | DROP变量列表;
RUN;

在该过程中,DATA步会读取原数据集的所有变量,但在写入新数据集前只保留部分变量。新数据集中包含的变量由所使用的语句(KEEP语句或DROP语句)给出的变量列表确定。使用KEEP语句表示只选取变量列表中变量,而使用DROP语句则表示选取除变量列表之外的其他所有变量。
例3.2:读取数据集sashelp.shoes中跟产品销售相关的变量Product、Stores和Sales,建立新数据集。
下面两段代码分别使用KEEP语句和DROP语句来完成上述功能,生成数据集work.shoes_part3和work.shoes_part4。
代码1:

data work.shoes_part3;
    set sashelp.shoes;
    keep Product Stores Sales;
run;

代码2:

data work.shoes_part4;
    set sashelp.shoes;
    drop Region Subsidiary Inventory Returns;
run;

在代码1中,DATA步会读取数据集sashelp.shoes中的所有变量,并选取KEEP语句指定的Product、Stores和Sales创建新数据集work.shoes_part3。在代码2中,DATA步的DROP语句指定了Region、Subsidiary、Inventory和Returns,那么剩下的变量Product、Stores、Sales会被选取写入数据集work.shoes_part4。这里所生成的数据集work.shoes_part3和work.shoes_part4也和work.shoes_part1相同。
使用KEEP语句还是DROP语句,与选择使用数据集选项KEEP=还是DROP=的标准一样。从上面的示例中可以看出,它们都可以实现相同的功能。那么,在开发程序时具体该怎样选择呢?
先来理解一下它们在执行过程中的不同之处。在DATA步中,SET语句会将数据读入程序数据向量PDV中。在SET语句中使用数据集选项时,只有选取的变量才会被读入PDV中,最后写入新数据集。而使用KEEP和DROP语句来选取变量时,SET语句会将原数据集中的所有变量读入PDV中,然后再通过相应的KEEP和DROP语句进行选取并写入新数据集。所以数据集选项KEEP=和DROP=会控制读入程序数据向量PDV中的变量,使用数据集选项通常会更有效率。
另外,有些功能可以通过数据集选项KEEP=和DROP=实现,但KEEP和DROP语句不能实现,接下来会介绍。
3.?一个DATA步中创建多个数据集
数据集选项KEEP=和DROP=除了可以在SET语句中使用之外,还可以用于DATA语句中指定的数据集。这样就可以在一个DATA步中通过给每个数据集使用选项KEEP=和DROP=来创建包含不同变量的多个数据集。而KEEP和DROP语句却实现不了该功能,因为它们会影响所有的输出数据集。
例3.3:分别读取数据集sashelp.shoes中关于产品销售情况的变量(Product、Stores及Sales)和产品库存情况的变量(Product、Inventory及Returns),并将这两类变量写入两个数据集work.shoes_sales和work.shoes_inventory。
代码如下:

data work.shoes_sales (keep=Product Stores Sales)
     work.shoes_inventory (keep=Product Inventory Returns);
    set sashelp.shoes;
run;

proc print data=work.shoes_sales (obs=5) noobs;
    title "Product Sales";
run;

proc print data=work.shoes_inventory (obs=5) noobs;
    title "Product Inventory";
run;

两个PRINT过程打印的数据集work.shoes_sales和work.shoes_inventory中的前5条数据分别如图3.2和图3.3所示。它们分别包含变量Product、Stores、Sales和Product、Inventory、Returns。
       
image

4.?有效地使用数据集选项KEEP=和DROP=
在DATA步中,可在DATA语句和SET语句中使用数据集选项KEEP=和DROP=。在DATA语句使用这些选项,PDV中会包括输入数据集中的所有变量,不过,只有当变量从PDV中写入结果数据集时,这些选项才会产生影响。然而,在SET语句中使用这些选项时,这些选项会确定哪些变量要从输入数据集中读取到PDV中,也就是说,SAS不会将未包括的变量读入PDV。在数据集很大时,这种方式会使程序执行更有效率。
在上面代码的基础上可在SET语句中增加选项DROP=来控制变量Region和Subsidiary不被读入PDV,以提高程序执行效率。如下:

data work.shoes_sales (keep=Product Stores Sales)
     work.shoes_inventory (keep=Product Inventory Returns);
    set sashelp.shoes (drop=Region Subsidiary);
run;

有时候,部分变量虽然不需要输出到新数据集,但在进行运算处理时却需要用到,这时候这些变量必须被读入PDV中,那么此时就不适合在SET语句中使用数据集选项KEEP=和DROP=了。对于这种情况,可在DATA语句中使用数据集选项KEEP=、DROP=,或使用KEEP、DROP语句来实现。

相关文章
|
7天前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
22 2
|
16天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
25天前
|
存储 C# 容器
C变量数据类型深度解析:打造高效代码的基石
C变量数据类型深度解析:打造高效代码的基石
13 1
|
19天前
|
存储 缓存 算法
Python中collections模块的deque双端队列:深入解析与应用
在Python的`collections`模块中,`deque`(双端队列)是一个线程安全、快速添加和删除元素的双端队列数据类型。它支持从队列的两端添加和弹出元素,提供了比列表更高的效率,特别是在处理大型数据集时。本文将详细解析`deque`的原理、使用方法以及它在各种场景中的应用。
|
21天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
44 1
|
25天前
|
设计模式 算法 数据安全/隐私保护
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
25 0
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
|
25天前
|
存储 算法 编译器
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(一)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
35 0
|
6天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。
|
7天前
|
机器学习/深度学习 分布式计算 BI
Flink实时流处理框架原理与应用:面试经验与必备知识点解析
【4月更文挑战第9天】本文详尽探讨了Flink实时流处理框架的原理,包括运行时架构、数据流模型、状态管理和容错机制、资源调度与优化以及与外部系统的集成。此外,还介绍了Flink在实时数据管道、分析、数仓与BI、机器学习等领域的应用实践。同时,文章提供了面试经验与常见问题解析,如Flink与其他系统的对比、实际项目挑战及解决方案,并展望了Flink的未来发展趋势。附带Java DataStream API代码样例,为学习和面试准备提供了实用素材。
26 0
|
14天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。

推荐镜像

更多