SAS-编程中的小技巧(三)

这又是一篇SAS编程中的小技巧,这次要说的是SAS中数据字典与Macro结合起来的使用技巧,以及数据集删除、保存等技巧....

认识一个逻辑库

首先,我们要在来认识一下SAS一个自带的逻辑库,是什么逻辑库呢,那就是SASHELP逻辑库,这个逻辑库对于SAS至关重要,这个逻辑库不仅提供了大量的练习数据集,还有一些不一样的数据集...那么先看看一张图,到底是怎么一个不一样...

这个图!有点长!这些表有一些小齿轮...这些表对于SAS很重要,SAS的很多属性,配置都是以表的形式储存下来...也就是储存在这样的表里面...红色部分圈起来的俩个表是比较常用的表...也是数据集字典的来源...

VTABLE

你遇到过定义逻辑库的时候,逻辑库名称是“无效”的SAS名称么?如果你没遇到不妨来看看下面一行代码...

libname testdatalib "D:\日常练习";

看着段代码,能发现问题么?是有问题的,逻辑库名称太长了,超过了8位!日志是会报ERROR的!那么为什么SAS的逻辑库名称不能超过8位的长度...大概是因为VTABLE这个表中逻辑库名称的那一列的变量长度定义的是8的原因吧...所有定义长度超过8的时候,逻辑库名称就写不进VTABLE那张表...以及其它的好多表...(个人揣测!

)

VTABLE中常用到的几个变量:

libname:Library Name

memname:Member Name

nobs:Number of Physical Observations

nvar:Number of Variables

说到这儿,还没有说到数据字典...比如:我们要获取某逻辑库下的所有数据集名称,实际应用场景:数据集循环,进行一致的操作等,先来看看一段代码...

%macro dsloop;
proc sql noprint;
select count(*) into: _loop from dictionary.tables where libname=upcase('sashelp');
select memname into:dsn1-:dsn%left(&_loop.) from dictionary.tables where libname=upcase('sashelp');
quit;
%do i=1 %to &_loop.;
  %put NOTE:&&dsn&i. &i.;
%end;
%mend;
%dsloop;

这段代码的效果可以获取SASHELP逻辑库下所有的数据集个数,并逐一赋值给宏变量,利用循环进行一些操作...dictionary.tables :这里的dictionary.tables 大概就是指向的SASHELP.VTABLE那张表,如果将之与SASHELP.VTABLE做替换,效果是一样的....

比如:我们要获取某数据集的观测数,变量数...数据集创建时间等...

proc sql noprint;
select compress(strip(put(nobs,best.))),compress(strip(put(nvar,best.))) into :_nobs,:_nvar
from dictionary.tables 
where libname=upcase("sashelp") and memname=upcase("class");
quit;

%put NOTE:数据集SASHLEP.CLASS有:观测数&_nobs.   变量数:&_nvar.;

注意事项:memname=upcase("...") 为啥需要upcase呢,可以从SASHELP.VTABLE中发现,libname、memname列下的观测都是大写,不大写就匹配不上...所有啊,一定不要忘记大写...

VCOLUMN

在SASHELP中还有另外一张表也是很常用的,那就是SASHELP.Vcolumn

Vcolumn中常用到的几个表里:

libname:Library Name

memname:Member Name

name:Column Name

type:Column Type

length:Column Length

label:Column Label

format:Column Format

这张表是针对数据集内变量属性与结构的...这儿我就不举例子了,和上面的一样类似...

Proc Contents

在SAS中还有另外一种获取逻辑库下所有数据集/指定数据集结构的方式...就是proc contents过程步!这个过程步,是很好用的...如果要出一个数据集的Spec,那么SAS可以基于这个过程步来快速的输出数据集结构等信息...来看看一个简单的例子..

/*逻辑库下所有数据集结构*/
   proc contents data=RAW._ALL_ out=_aa  noprint;
   run;
/*逻辑库下指定数据集*/
   proc contents data=RAW.AE out=_aa  noprint;
   run;

那么在实际编程中,还有什么地方可以用到这个过程步呢?发挥出你的想象,一个数据集的结构列表在你手上你可以干嘛?那么来看看一个简化的代码...

proc contents data=SASHELP.CLASS out=_varstemp10 DIRECTORY NOPRINT MEMTYPE=data CENTILES;
proc sort data=_varstemp10  out=_varstemp10(where=(type=1) )  ;by memname Varnum ;
run;
data _null_;
  set _varstemp10 end=Last  ;
  length final temp$800.;
  temp=strip(NAME)||strip('_c=strip(vvalue(')||strip(NAME)||strip('));');
  retain final ' ';
  final=catx(' ',final,temp);
  if last then call symput('N',strip(final));
  call execute("data Class;set SASHELP.CLASS;&N.;run;");
run;

此处例子,是将SASHELP.CLASS中数值型变量衍生成字符型....从这个例子中可以引申出很多类似的操作,大量变量对于同一指标的筛查,变量批量rename,批量加label等等,可见小编历史推送Macro-csv2sas(可控制变量Length)(虽然这个有人吐槽不好,不过小编也懒得改了...)里面好像是有这样操作的例子,当然还可以进行一些语句判断啊等等....

快速删除数据集

经常,我们需要在SAS中删除一些数据集...那么如何删除数据集呢?删除的方法众多...来见见一些常见的方法...

/*_ALL_ 表示逻辑库下所有数据集*/
proc delete data=work._all_;quit;  
/*删除逻辑库下单个数据集*/
proc delete data=work.ae;quit;

proc delete 过程步,可以实现清空逻辑库下指定数据集/全部数据集的作用....

/*
删除WORK逻辑库下 CLASS 数据集
memtype=data   只针对逻辑库下属性为data 也就是数据集进行操作
*/
proc datasets lib=work nolist memtype=data;  
delete   Class;
quit;
/*
删除WORK逻辑库下所有数据集
*/
proc datasets lib=work nolist kill memtype=data; 
quit;
/*
有时候我们不需要删除全部,只想保留部分数据集就可以用SAVE语句
*/
proc datasets lib=work nolist memtype=data;
  save   Class;
run;

proc datasets 过程步,小编觉得这个过程步很值得学习一下.....见上面的几个例子,更多例子可以看帮助文档...

既然在PROC SQL中能创建数据,那么PROC SQL中能否删除数据集呢...是可以的。

proc sql noprint;
drop table eg,mh;
quit;

数据集的复制

既然我们需要删除逻辑库下的数据集,那么也会经常遇到把逻辑库下的数据集从一个逻辑库复制到另外一个逻辑库...当然Set是可以的,但是Set的时候有没有觉得太没有效率呢....

libname raw "D:\日常练习\Traning\RAW";
/*复制逻辑库下全部数据集*/
proc copy in=RAW out=WORK memtype=data;
run;

/*复制逻辑库下制定数据集*/

proc copy in=RAW out=WORK memtype=data;
select rand eg;
run;

文件的管理

这并不是一个技巧!但文件的管理不管对于SAS编程的学习,还是对于其他的任何工作,都是很重要的...为啥呢?因为SAS知识太多了!在学习的过程中经常会写大量的程序去测试功能、去学习知识啊...也会在网络上下载大量的学习资料,分门别类是很重要的,我不相信当你掌握了知识点以后就不会忘记,在忘记的时候,如何快速的拾起来,那就是看你当初学习的时候,你自己写的测试程序....和整理的知识点啊,资料啊....当然小编觉得这也是一个财富,如果以后你需要带人,你就可以稍微整理下自己的笔记一股脑的丢给新人

下面看一下小编最近的日常练习的夹子...其实现在老后悔了,以前刚学习的时候丢掉了大量练习程序....

本文分享自微信公众号 - SAS程序分享号号号(xiaocgn)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏.Net Core技术分享

jQuery插件开发学习笔记

  今天想了解一下jQuery的插件开发,于是google了一下,列在前面的两篇文章都很不错,jQuery插件开发全解析 更是将插件开发的方方面面细致入微的进行...

9030
来自专栏Python乱炖

Python中的GIL是个什么玩意?

关于 Python的多线程,经常我们会听到老手说:“python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢?

11220
来自专栏ATYUN订阅号

利用AI分析宇宙中有多少暗物质

当今科学界面临的最大挑战之一是了解我们的宇宙是如何形成今天的样子的,以及它最终的命运是什么。每当黑夜降临,无数的星星会出现在我们的视线里,但这只是宇宙的一部分,...

9450
来自专栏编程语言xuetang

Arrays.asList使用指南

  List是一种很有用的数据结构,如果需要将一个数组转换为 List 以便进行更丰富的操作的话,可以这么实现:

7440
来自专栏Python乱炖

Python的线程Thread的自我介绍

首先,我想说的是,我(线程)不只是在python中会出现,我在任何编程语言中都可以使用代码将我实现,所以,简单来说我是一个机制,在一些特别的情况下会遇到我。

11920
来自专栏编程语言xuetang

Java集合,HashMap底层实现和原理

  首先在基于JDK1.7进行分析,对于JDK1.8所做的改动也会在文章中逐步进行说明。

13620
来自专栏Python乱炖

MachineLearning ----KNN

今天呢,我们就要来接触稍微高级一点的东西了,我们所做的事情不仅仅局限于代码的层面上了,要基于某种算法解决问题,而此时的python则是我们完成问题的工具啦!

8020
来自专栏编程语言xuetang

DAO设计

Data Access Object(数据存取对象),位于业务逻辑和持久化数据之间,实现对持久化数据的访问。

8330
来自专栏编程语言xuetang

JDBC简介及DML、DQL操作

4.JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统

11130
来自专栏Python乱炖

Python表达式内赋值

消息来源为PEP 572,该PEP已经被讨论通过,最终发布时细节可能会有改动,但是一定会发布。该提案网址:https://www.python.org/dev/...

11010

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励