网络知识 娱乐 SAS-一个小程序实现变量类型的自动转化~

SAS-一个小程序实现变量类型的自动转化~

做为标题党的小编,一贯喜欢将标题写很大...嗯,最近写了一个小程序,虽然是一个没有任何技术含量的程序,不过还是想分享给大家。这个程序实现的功能是将SAS数据集中数值型变量转换成字符型变量,如果变量含有format,这时会将显示的format的值直接赋值给新的变量。

一个小功能

写这个宏的功能与目的是啥呢。在利用export输出csv,excel时,我们输出的总是数据存储的实际值,而很多时候需要呈现format显示的值。所以我就写了这个小程序,

基本一点技术含量都没有,就用了sql定义宏变量的方式,然后一个vvalue函数,最近感觉爱上这个函数了...下面看代码

/*************************************************************************************************************************
宏名称    :  ds_var2char

目的      :  将数值型变量/提取format的值

参数说明    :    
  
inds     输入数据集
outds    输出数据集
length   长度 :  默认值2500
type        
1:数据集第一条观测为变量的标签
2:数据集第一条观测为变量的名称
3:数据集第一条观测为变量标签、数据集第二条观测为变量的名称
0:数据集不包含变量相关信息;   默认值为:0

%ds_var2char(inds=sashelp.class,outds=class);

________________________________________________________________________________________________________________________
*
__________________________________________________________________________________________________________________________
版本     日期           修改人             修改描述
---     -----------    ------------     ----------------------------------------------------------------------------------
1.0     2018.05.07      setup~           创建
****************************************************************************************************************************************/;

%macro ds_var2char(inds=,outds=,type=0,length=2500);
proc contents data=&inds. out=ds_cnt_temp(keep=name label varnum) directory noprint memtype=data centiles;
proc sort data=ds_cnt_temp  out=ds_cnt_temp  sortseq=linguistic(numeric_collation=on);by varnum ;
run;
proc sql noprint;
select name into:msvar_temp separated by " " from ds_cnt_temp   ;
select strip(name)||"_c="||"strip(vvalue("||strip(name)||strip("))") into:ys_vas1 separated by " ;" from ds_cnt_temp   ;
select strip(name)||"_c="||strip(name) into:re_vas1 separated by " " from ds_cnt_temp   ;
select strip(name)||"_c" into:msvar_temp2 separated by " " from ds_cnt_temp   ;
quit;
data ds_cnt_temp;
set ds_cnt_temp;
names=name;
labels=label;
run;
proc transpose data=ds_cnt_temp out=ds_cnt_temp1 ;
var  labels names;
id name ;
idlabel label;
run;
data cnts_ds(rename=(&re_vas1.));
length &msvar_temp2. $&length.;
set &inds.;
&ys_vas1.;
drop &msvar_temp.;
run;
data &outds.;
length &msvar_temp. $&length..;
set ds_cnt_temp1(keep=&msvar_temp.)  cnts_ds;
%if &type.=1 %then %do;
if _N_=2 then delete;
%end;
%if &type.=2 %then %do;
if _N_=1 then delete;
%end;
%if &type.=0 %then %do;
if _N_ in (1 2 )then delete;
%end;
run;
proc delete data=ds_cnt_temp1  ds_cnt_temp  cnts_ds  ;quit;
%mend;

没啥技术含量,宏代码复制就能用!参数注释部分应该已经说的很清楚了...不过还是用一个例子来证明一下Macro是没有问题的,大家请放心使用...

/*功能测试:定义format*/
proc format ;
value  sgs  1-<13="儿童"  13-<16="少年" 16 -High="青年" ;
run;
/*给年龄添加format*/
data test;
  set sashelp.class;
  format age sgs.;
run;
/*执行宏:执行后悔生成test1数据集*/
%ds_var2char(inds=test,outds=test1);