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

2019-10-20 18:48:38 浏览数 (1)

第一部分

做为一个曾经写了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:UsersAdministratorDesktoptemp_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通过前面的那个例子,作用已经不言而喻了,很简单吧,是的,很简单...替换字符用的...

0 人点赞