SAS-这几个小语法真的很鸡肋吗?

2019-10-21 17:37:03 浏览数 (1)

今天给大家分享一个看似鸡肋然则不鸡肋的语法...

真的鸡肋吗?

我们在写程序对大量数据集批量操作的时候,如果有的数据集有某变量,有的数据集没有某变量,而这个变量也作为程序处理的关键变量...这个时候我们就需要来判断某数据集中此变量是否存在,如果不存在生成该变量....那么有什么办法来判断数据集中某变量是否存在呢?当然办法也是很多的,不过下面的办法我想算是一个比较快捷的方式...下面来看一段小编写的转置小代码~

代码语言: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;

0 人点赞