前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS-这几个小语法真的很鸡肋吗?

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

作者头像
Setup
发布2019-10-21 17:37:03
1.6K0
发布2019-10-21 17:37:03
举报

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

真的鸡肋吗?

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

代码语言: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;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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