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

2019-10-20 18:43:58 浏览数 (1)

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

认识一个逻辑库

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

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

VTABLE

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

代码语言:javascript复制
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

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

代码语言:javascript复制
%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做替换,效果是一样的....

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

代码语言:javascript复制
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可以基于这个过程步来快速的输出数据集结构等信息...来看看一个简单的例子..

代码语言:javascript复制
/*逻辑库下所有数据集结构*/
   proc contents data=RAW._ALL_ out=_aa  noprint;
   run;
/*逻辑库下指定数据集*/
   proc contents data=RAW.AE out=_aa  noprint;
   run;

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

代码语言:javascript复制
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中删除一些数据集...那么如何删除数据集呢?删除的方法众多...来见见一些常见的方法...

代码语言:javascript复制
/*_ALL_ 表示逻辑库下所有数据集*/
proc delete data=work._all_;quit;  
/*删除逻辑库下单个数据集*/
proc delete data=work.ae;quit;

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

代码语言:javascript复制
/*
删除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中能否删除数据集呢...是可以的。

代码语言:javascript复制
proc sql noprint;
drop table eg,mh;
quit;

数据集的复制

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

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

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

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

文件的管理

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

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

0 人点赞