今天给大家分享一个看似鸡肋然则不鸡肋的语法...
真的鸡肋吗?
我们在写程序对大量数据集批量操作的时候,如果有的数据集有某变量,有的数据集没有某变量,而这个变量也作为程序处理的关键变量...这个时候我们就需要来判断某数据集中此变量是否存在,如果不存在生成该变量....那么有什么办法来判断数据集中某变量是否存在呢?当然办法也是很多的,不过下面的办法我想算是一个比较快捷的方式...下面来看一段小编写的转置小代码~
代码语言:javascript复制%macro comp_sum(indsn=);
%let dsid=%sysfunc(open(&indsn.));
%let varhave=%sysfunc(varnum(&dsid,SEQID));
%let rc= %sysfunc(close(&dsid));
%put ***********************************************************;
Skip 1;
%put DOMAIN:&indsn.中变量SEQID序号为:&varhave;
Skip 1;
%put ***********************************************************;
data comp_temp;
set &indsn.;
%if &varhave.=0 %then %do;
SEQID=.;
%end;
run;
proc sort data=comp_temp out=comp_temp sortseq=linguistic(numeric_collation=on);by VISIT SEQID ;quit;
proc transpose data=comp_temp(where=(^missing(SUBJID))) out=%scan(&indsn.,2,'.') prefix=C;
by VISIT SEQID;
var _all_;
id SUBJID ;
run;
%mend;
还是回到如何判断数据集中是否存在某变量这个话题上来,上面代码关于这个话题的核心在于获取数据集变量序号,如果数据集中没有此变量,则返回0,如果有此变量则返回变量的序号~看一下执行的宏以及日志!
代码语言:javascript复制%comp_sum(indsn=temp.AE)
%comp_sum(indsn=temp.DM)
嗯,数据集内容,小编就不拿出来了,这里面肯定是可以实现判断数据集里面是否存在某个变量。。
代码语言:javascript复制*Check数据集中某变量是否存在;
%let dsid=%sysfunc(open(SASHELP.CLASS));
%let varhave=%sysfunc(varnum(&dsid,sex));
%let rc= %sysfunc(close(&dsid));
%put **************************&varhave**************************;
*通过变量序号获取变量label;
%let dsid=%sysfunc(open(SASHELP.CLASS));
%let sss=%sysfunc(varlabel(&dsid,%sysfunc(varnum(&dsid,sex))));
%let rc= %sysfunc(close(&dsid));
%put **************************&sss**************************;
这样的函数~SAS还有很多,如何查呢?在SAShelp中搜索肯定是能找到....
纠一个错
前几天和同事讨论问题的时候,突然发现了自己对CMISS的理解有错误!!以前小编写的推送,CMISS是用来计算字符型的变量缺失个数,NMISS是计算数值型变量的缺失格式!实则不然,CMISS是一个很奇特的函数,数值型和字符型变量缺失个数都可以计算的!!!所以在这里纠正一下!
数据集属性的修改
前几天有人问我如何删除数据集里面的label,好吧,我以前很low,都是直接将label 赋值为空,虽然知道有快捷方式,也见过,但是也是一带而过...
复制一段SASHELP里面的程序例子,给大家分享一下如快速去掉数据集的label与删除数据集的format...
代码语言:javascript复制options ls=79 nodate nocenter;
title;
proc format;
value clsfmt 1='Freshman' 2='Sophmore' 3='Junior' 4='Senior';
run;
data class;
format z clsfmt.;
label x='ID NUMBER'
y='AGE'
z='CLASS STATUS';
input x y z ;
datalines;
1 20 4
2 18 1
;
run;
proc contents data=class;
run;
proc datasets lib=work memtype=data;
modify class;
attrib _all_ label=' ';
attrib _all_ format=;
run;
contents data=class;
run;
quit;