前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS-函数(一),总把新桃换旧符~

SAS-函数(一),总把新桃换旧符~

作者头像
Setup
发布2019-10-20 18:48:38
3.9K0
发布2019-10-20 18:48:38
举报

第一部分

做为一个曾经写了30+临床项目的数据清洗的SAS程序的小编打算本文将围绕数据清洗中的SAS函数应用展开。当然文中涉及的到例子SAS实现的方法很多可能并非是最佳方式,只是为了引出函数的使用方式…

小编以前见过很多data validation plan都会有核查某一些数据点填写规范性的问题,当然由于近年EDC的普及使用,现在基本上很少用SAS写核查程序了,但是不妨碍我们举出一些例子,引入SAS函数来实现一些需求,如:找出受试者姓名缩写不为4位大写英文字母...(见下code,引入Length、compress函数)

代码语言:javascript
复制
If length(compress(SUBJINIT,’’,’uk’))=4 and length(SUBJINIT)=4;

length

length函数的用法其实很简单,字面意思也是长度的意思,返回的是该变量对应观测的长度,并非变量的属性的长度。

comperss

compress函数,是SAS中最最最最常见的函数之一!也是一个功能很强大的函数,针对字符的操作,可以保留字符串,可以消除字符串等等...具体用法可以看SAShelp...此处compress(subjinit,'','uk'),k是保留的意思,u是大写的字母的意思,这样的写的效果就是保留字符串中的大写字母...小编刚学SAS做了一些笔记,现在已经忘记从那本书还是从哪个博客上备份下来的,列了一些参数,仅供参考,可能有错误~小编也记得每个参数的意思,只几个常用的,然后用的时候查笔记或者看SAShelp...

在数据清洗转换过程中,经常会遇到多个变量、字符串进行连接,比如:将中心编号与受试者编号以‘-’的方式连接起来,生成受试者唯一编号的,此处的写法太多了..且来看几种常见的写法。

代码语言:javascript
复制
d=catx("-",a,b);

CAT、CATS、CATT、CATX

在这里引出了连接函数,SAS中字符串连接方式很多,此处小编仅以常见的连接方式为例。

CAT函数有一个系列吧,CAT,CATX,CATS, CATT…看到这么多CAT有没有眼花缭乱,那么来看看:

CATX消除首位空格以参数连接符连接;CATS消除首位空格进行顺序连接;CATT删除连接的尾部空格进行连接;CAT不进行操作直接连接;

代码语言:javascript
复制
f1=strip(a)||'-'||strip(b);

strip、left、right、trim

在来看看Strip函数,其作用是消除首位空格,起到连接作用的是“||”符号,那么类似strip函数的还有哪些呢,小编目前常见的有left、right、trim;

分别的含义是:left消除左边空格;right 消除右边空格;trim消除尾部空格;

这个时候在会头去看看cats、catt函数,这里的后缀S/T,其含义就不言而喻了,分别对应的strip/trim。仅小编个人观点…

在SAS编程过程中,经常遇到需要判断一个字符串是否包含某特定字符的操作,实现的方法有很多;例如:“蘑/菇/是/一/个/小/、/东/西“ ,如何用程序来判断这个字符串里面包含了’、’这个符号呢,(这个例子来源于一条群消息,一群大佬在讨论SAS中的K函数).那么就来看看此处该如何实现。

代码语言:javascript
复制
If kindex(a,’、’)>0;

kindex、index、indexc

看到Kindex,是否有疑问,index是索引的意思,为什么前面要加一个K呢?这个问题小编也不能很好的回答,只能粗略的知道一点因为中文在SAS中是以双字节的形式存在的,K大头的函数就是为了一些编码相似度高的识别错乱的情况。Index返回的特定字符在字符串中从左到右的位置(一个数值).接下来来看看之前大佬们讨论的内容,

当初本来打算写“一条群消息引发的思考(三)”但是由于“一条群消息引发的思路(二)”阅读并不理想,所以这个地方就一直没写...

关于SAS底层的编码小编也是不懂了,所以就不继续深入这些了,在针对双字节的时候还是用K函数要好...那么就来看看另外的index,indexc,其实小编用的不太多,刚学SAS的时候从function那本书上找了一点例子做了一个写笔记,就直接贴图了,更多还是请看function那本书,或者SAShelp搜索index...

代码语言:javascript
复制
if find(a1,'、')>0;

find、findc、findw

Find也有一个系列(findc、findw),看到这儿是不是发现SAS中函数都很有特色,很容易就是一个系列的出来….其实吧,find函数和index函数很像,返回的也是一个位置,但是吧,这个是没有kfind函数的存在的…这个例子并没有体现index、find函数在范围特定字符串位置的妙用,那么久在来看一个例子:比如我们在利用pipe得到文件名称的时候,去掉后缀...

代码语言:javascript
复制
filename xcl_fil pipe "dir 
C:\Users\Administrator\Desktop\temp_sas_pgm\*.sas /b"; 
data a;
infile xcl_fil truncover;
input fname $char1000.;
put fname=;
uf=find(fname,'.',-200);
ef=substr(fname,1,uf-1);
run;

看到上面的代码,为什么我这里find用一个-200的参数呢,find(fname,'.',-200);这个-200代表的什么意思呢?我想其实很多人都知道,但同样有很多人都不知道,小编这是这样理解的,-200得拆开来解释,200表示从左到右200个字符长度,‘-’表示从这个200个长度从右到左第一次出现的位置。

那么就来看看find、findc、findw的用法(从function书中摘抄出来的),更多相关用法还是看书好。

其实一个字符串中包含某些特定字符,常规方法并不这样写,那么现在顺便看一下常规方法。

代码语言:javascript
复制
where a1 like  '%、%';/*包含写法1*/
where a1 contains  '、';/*包含写法2*/
.../*应该还有N种写法*/
if a1= :'蘑';/*找出以某个字符打头的观测,可以用:*/

substr

回到前面的那个例子(ef=substr(fname,1,uf-1)),这里出现了substr,这个函数是干什么的呢?substr是字符串截取的意思,此处是将fname下面的观测,从第1个字符开始,截取的长度是uf-1。这个是很简单的。

代码语言:javascript
复制
data aaaa;
length dat $2000.;
input dat $;
ts2=substr(dat,1,4);
/*从第1个字符开始,截取长度为4个长度*/
ts1=substr(dat,6);
/*从第6个字符开始截取,没有第三个参数则默认截取后面全部的内容*/
cards;
2016-03-31
2016-07-04
2017-10-13
2018-02-06
;
run;

Scan、kscan

看到scan和Kscan,是不是觉得有点眼熟,在说kindex的时候引用的俩条群消息的截图里面,就正好有Kscan的例子(K开头的函数大部分是一样的针对双字节的一种措施),先来说scan,字面意思就扫描。获取某特定字符的第一部分,第二部分....来是以日期的那个为例子。

代码语言:javascript
复制
data aaaa;
length dat $2000.;
input dat $;
yy=scan(dat,1,'-');
mm=scan(dat,2,'-');
/*此处的1,2表示截取的是从左到右以‘-’为分割的第一部分,第二部分*/
dd=scan(dat,-1,'-');
/*此处的-1表示截取的是从右到左以‘-’为分割的第一部分*/
cards;
2016-03-31
2016-07-04
2017-10-13
2018-02-06
;
run;

说了好几个函数了,感觉是时候到一波练习的时候了...

小编有一句话:

%let varlist=填写要成列的变量1\变量的标签1\二级标签的识别号1\二级标签1|填写要成列的变量2\变量的标签2\二级标签的识别号2\二级标签2 ;

想要让其变成这个样子的的结构:

该怎么实现呢?用刚刚的函数?好吧,还是直接看代码吧。

代码语言:javascript
复制
%let varlist=填写要成列的变量1\变量的标签1\二级标签的识别号1\二级标签1
|填写要成列的变量2\变量的标签2\二级标签的识别号2\二级标签2  ; 
data  c_;
length a $20000;
a="&varlist";
n=count(a,'|');
j=n+1;
do i=1 to j;
c=compress(scan(a,i,'|'),'');
d=compress(scan(c,1,'\'),'');
e=compress(scan(c,2,'\'),'');
f=compress(scan(c,3,'\'),'');
g=compress(scan(c,4,'\'),'');
n=i;
output c_;
end;
keep  c d e f g n; 
run;

Count

看上面的例子,有没有看到Count函数,是的上面的例子就是为了引出Count函数,Count函数是一个很好的函数

可以计算某特定字符、字符串在一个字符串中出现的个数...例子小编就不再举了,上面就是一个很好的例子,更多还是看SASHELP...

在数据处理过程中,一般都会遇到缺失日期,缺失日期如何填补呢,一般SAP里面都有规定,常见的月缺失补07,日缺失补15...突然发现这个例子好像与我小说的函数不太合适,那就假装月缺失填NK,日缺失填UK..(.其实一般不是这样的)

代码语言:javascript
复制
data a;
dat="2018-NK-UK";
dar1=tranwrd(tranwrd(dat, "NK", "07"),"UK","15");
run;

tranwrd

tranwrd通过前面的那个例子,作用已经不言而喻了,很简单吧,是的,很简单...替换字符用的...

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档