Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SAS-编程中的小技巧(三)

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

作者头像
Setup
发布于 2019-10-20 10:43:58
发布于 2019-10-20 10:43:58
2.5K01
代码可运行
举报
运行总次数:1
代码可运行

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

认识一个逻辑库

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

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

VTABLE

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
%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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
/*逻辑库下所有数据集结构*/
   proc contents data=RAW._ALL_ out=_aa  noprint;
   run;
/*逻辑库下指定数据集*/
   proc contents data=RAW.AE out=_aa  noprint;
   run;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
/*_ALL_ 表示逻辑库下所有数据集*/
proc delete data=work._all_;quit;  
/*删除逻辑库下单个数据集*/
proc delete data=work.ae;quit;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
删除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
代码运行次数:0
运行
AI代码解释
复制
proc sql noprint;
drop table eg,mh;
quit;

数据集的复制

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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知识太多了!在学习的过程中经常会写大量的程序去测试功能、去学习知识啊...也会在网络上下载大量的学习资料,分门别类是很重要的,我不相信当你掌握了知识点以后就不会忘记,在忘记的时候,如何快速的拾起来,那就是看你当初学习的时候,你自己写的测试程序....和整理的知识点啊,资料啊....当然小编觉得这也是一个财富,如果以后你需要带人,你就可以稍微整理下自己的笔记一股脑的丢给新人

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAS程序分享号号号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SAS-Macro 中的那些语句(一)
说到Macro,那么就不得不说宏变量,宏变量的是啥呢?可以理解成和其它编程语言中的变量一样,在内存中创建了一个空间(给这个空间一个标记,宏变量的名称),然后将一些值放到这个内存空间中(这就是定义宏变量的过程),好吧,我是一个不善解释的人,没理解的还是自行百度领悟。那么就来看看如何来定义Macro变量。
Setup
2019/10/21
2.5K0
SAS-Macro 中的那些语句(一)
当+(加号)碰上input&Excel测量文本长度
2.SDTM.LB.LBSTREFC这个变量在IG3.2里是Perm,IG3.3里是Exp,IG3.4里是先改成Perm,然后把这个变量删掉了 https://www.cdisc.org/kb/known-issues/lbstrefc-core-attribute-should-not-have-been-expected-sdtmig-v3-3
归海刀刀
2024/02/05
1580
当+(加号)碰上input&Excel测量文本长度
SAS-如何找出数据集超长变量及观测,并自动进行变量的拆分...
前段时间有人给小编提了一个需求,找出数据集中长度超过200字节的变量,并对变量进行拆分...这个需求当然不难,但是还是分享给大家~主要最近没写啥程序,也就没学到啥新的技能...关于变量长度的拆分,我想也是一个常见的问题。
Setup
2019/10/20
3.9K0
SAS-新规试行下诞生的程序
昨日,《药物临床试验数据递交指导原则》(试行)版正式公布了,在小编阅读后,于是本文因时而生了。
Setup
2020/07/24
2.2K0
SAS-新规试行下诞生的程序
SAS-编程中的小技巧(六)
前段时间有人问小编,批量执行ods输出文件时,总是弹出并打开输出的文件,有没有办法关闭呢?你是否也遇到这样的问题,而找遍ods相关的Option仍无法解决呢?解决办法其实还是很简单的。下面来看看怎么解决。
Setup
2019/10/20
1.8K0
SAS自定义函数获取某逻辑库下所有表名
今天看到一个群友提的一个问题:SAS有无一个函数将某LIBNAME下表名都取出?这个问题用字典数据表或者视图(DICTIONARY Tables and SASHELP Views)可以轻松解决。如获取逻辑库SASHELP下所有表名,代码如下:
专业余码农
2020/07/16
3K0
SAS自定义函数获取某逻辑库下所有表名
SAS- 100种数据compare的方式,你在用哪种?
小编是医药行业的,所以小编的推送涉及的知识也多为SAS在临床研究中的运行及SAS数据清洗等相关的程序,在临床试验中,很多SOP相对完善的公司,出于对数据质量的把控,一般项目都会采用double programming,一个项目会有多个人参与,写俩份独立的程序,最终会对结果进行compare,今天的主题就是数据的compare.
Setup
2019/10/21
2.2K0
SAS︱数据索引、数据集常用操作(set、where、merge、append)
数据索引的创建有三种方式:data步骤、sql步骤、datasets步骤。 其中还是有点困惑在data与datasets的区别之上,datasets是对逻辑库中数据集进行操作的方式,而data之后是代表程序的开始。
悟乙己
2019/05/27
7.1K0
批量改变SAS数据集字符型变量的长度
临床试验的SAS程序猿/媛都知道,FDA对所提交的数据集的大小是有限定的,因为数据集过大在操作时会有点麻烦(比如打开会很慢),所以当我们生成最终的数据集时就要进行一个操作:按照字符型变量值的最大长度来重新定义变量的长度,以删除多余的空格从而减少数据集的大小。下面贴上我去年写的实现这一目的的宏程序:
专业余码农
2020/07/16
3.1K0
Macro-SAS2XPT/XPT2SAS
1.proc cport 过程步,与之对应的是XPT生产SAS数据的方式proc cimport 。
Setup
2019/10/21
3.3K0
Macro-SAS2XPT/XPT2SAS
SAS-生物等效性PK分析程序合集
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍近期小编整理了一下生物等效性(BE)试验中PK分析部分的常规处理程序。于是就来分享一下这部分Winnonlin上的操作以及对应的利用SAS实现的程序。
Setup
2021/04/20
6.8K0
SAS-生物等效性PK分析程序合集
Macro-Output Query(Edit Check Macro)
愉快的周末又要结束了,繁忙的周一也即将开始!小编今天给大家Share的一个Macro是关于临床数据清理中的一个实用性的Macro,SAS Edit Check Output Query. -- Setup
Setup
2019/10/21
1K0
Macro-Output Query(Edit Check Macro)
SAS-一个小程序实现变量类型的自动转化~
做为标题党的小编,一贯喜欢将标题写很大...嗯,最近写了一个小程序,虽然是一个没有任何技术含量的程序,不过还是想分享给大家。这个程序实现的功能是将SAS数据集中数值型变量转换成字符型变量,如果变量含有format,这时会将显示的format的值直接赋值给新的变量。
Setup
2019/10/21
1.2K0
SAS-函数(三),这几个函数你都知道吗~
昨天最后的一个函数是Lag,那么今天的第一个函数是和昨天的lag很类似,Lag可以将前一条观测下移,然后求差值,那么今天这个函数是可以直接求上下观测的差值...下来看看这段代码...
Setup
2019/10/20
4.7K0
SAS-这几个小语法真的很鸡肋吗?
我们在写程序对大量数据集批量操作的时候,如果有的数据集有某变量,有的数据集没有某变量,而这个变量也作为程序处理的关键变量...这个时候我们就需要来判断某数据集中此变量是否存在,如果不存在生成该变量....那么有什么办法来判断数据集中某变量是否存在呢?当然办法也是很多的,不过下面的办法我想算是一个比较快捷的方式...下面来看一段小编写的转置小代码~
Setup
2019/10/21
1.7K0
SAS-这几个小语法真的很鸡肋吗?
SAS-爬取帖子下的邮箱,给他们发一封邮件...
SAS中获取网页上信息的原理其实很简单,就是将网页上的html代码给导入进数据集中,然后利用一定规律来获取自己想要的提取的信息...(目前个人浅显的理解),那么如何来将网页的代码直接导入的数据集中呢,见如下代码...
Setup
2019/10/21
7630
SAS-爬取帖子下的邮箱,给他们发一封邮件...
SAS-一个小程序实现自动插入空白行~
前几天一个朋友问我如何快速的在数据集中指定位置插入空白记录。当时我也是愣了一下,以前实现输出制作排版都是在proc report输出时进行设置的,还真没在数据集中的指定位置添加空白行(proc report通过out=也可以实现,感觉又写麻烦)。所以呀,小编就写了一个小程序,来实现数据集中指定位置添加空白行!虽然程序的功能很单一,但是同样小编认为是这也是一个很有趣的程序,所以啊,小编就给大家分享一下下~
Setup
2019/10/21
2.3K1
SAS-100种输出Excel的方法,你在用哪种?
你是被标题吸引来的么?那么小编就要向你道歉了,100种?当然是没有的,但还是有很多中,小编今天的要盘点的一下SAS输出Excel的方法,各种方式之间的优劣。其实好几天前就打算写的,也是在好几天前开始酝酿,一直没有空下来的时间,年底了,各种忙,小编的时间就像是被挤干了的海绵一样,这几天怎么挤都挤不出。废话好像有点多,还是回到今天的主题上~
Setup
2019/10/21
6K0
SAS-输出文档生成目录的方法
前段时间有一个需求,利用SAS实现文档目录的自动生成。这里小编没有限定文档的类型,是因为本文将分享两种类型文档(PDF/RTF)通过SAS自动生成目录的方法。
Setup
2020/09/01
3.2K0
SAS-输出文档生成目录的方法
SAS学习︱逻辑库、数据集创建与查看、数据库链接(SAS与R的code对照)
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/52839677
悟乙己
2019/05/27
4.3K0
推荐阅读
相关推荐
SAS-Macro 中的那些语句(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验