做为标题党的小编,一贯喜欢将标题写很大...嗯,最近写了一个小程序,虽然是一个没有任何技术含量的程序,不过还是想分享给大家。这个程序实现的功能是将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);