SAS中文论坛
标题:
把每个变量的value label生成数据集
[打印本页]
作者:
shiyiming
时间:
2011-10-27 16:37
标题:
把每个变量的value label生成数据集
若用proc format,可将在该过程步定义的value生成数据集。但是现在有一数据集,数据集中的变量未经过proc format的定义已有value label(例如1表示“男”,2表示“女”),现想要把这些变量的value label生成类似经过proc format的数据集,请问各位,有什么办法可以实现吗?
谢谢各位! <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者:
shiyiming
时间:
2012-5-27 11:39
标题:
Re: 把每个变量的value label生成数据集
一般情况下,proc contents 是能把标签储存为数据集的,如果不能,这的确是个有趣的问题,希望楼主再看到这个帖子是,提供原始数据,以便我们进一步测试实验。
作者:
shiyiming
时间:
2012-5-27 14:51
标题:
Re: 把每个变量的value label生成数据集
[code:2zh9vm59]
libname myfmt "c:\covance";
proc format library=myfmt;
value gender
1='UMale'
2='UFemale';
run;
proc format;
value gender
1='TFeMale'
2='TMale';
value seq
1='one'
2='two'
3='three';
run;
options fmtsearch=(myfmt work);
/*options fmtsearch=(work myfmt);*/
data raw;
input gender;
id=_n_;
format gender gender. id seq.;
datalines;
1
2
2
;
%macro searchFormat(libn=work,indsn=,outdsn=out);
%let mprintState=%sysfunc(getoption(mprint)) %sysfunc(getoption(notes));
options nomprint nonotes;
%let libn=%upcase(&libn);
%let indsn=%upcase(&indsn);
%if %sysfunc(exist(&libn..&indsn))=0 %then %do;
%put WARNING-*** DATASET &libn..&indsn DOES NOT EXIST! ***;
%goto exist;
%end;
%let fmtSearchSeq=%sysfunc(compress(%sysfunc(getoption(fmtsearch)),(),));
proc sql noprint;
create table fmtList(drop=seq) as
select libname, objname, indexw("&fmtSearchSeq",libname) as seq
from dictionary.catalogs
where objtype='FORMAT' and
objname in (select tranwrd(format,'.','') from dictionary.columns
where libname="&libn" and memname="&indsn")
group by objname
having min(ifn(seq=0,99,seq))=seq
order by libname;
quit;
data fmtList(drop=objname);
length fmtList $500;
do until(last.libname);
set fmtList;
by libname;
fmtList=catx(' ',fmtList,objname);
end;
run;
%if &sqlobs=0 %then %do;
%put WARNING-*** USER DEFINED-FORMAT DOES NOT EXIST! ***;
%goto exist;
%end;
%else %if %sysfunc(exist(&libn..&outdsn)) %then %str(proc delete data=&libn..&outdsn;run;);
%let dsid=%sysfunc(open(work.fmtList,i));
%let num=%sysfunc(attrn(&dsid,nlobs));
%if &num gt 0 %then %do;
%syscall set(dsid);
%do i=1 %to &num;
%let rc=%sysfunc(fetchobs(&dsid,&i));
proc format library=&libname cntlout=work._temp;
select &fmtList;
run;
proc append base=work.out data=work._temp; run;
%end;
%end;
%let rc=%sysfunc(close(&dsid));
proc delete data=fmtList _temp; run;
%if &rc=0 %then %put WARNING-*** SUCCESSFUL EXECUTED! ***;
%exist:
options &mprintState;
%mend searchFormat;
%searchFormat(indsn=raw)[/code:2zh9vm59]
欢迎光临 SAS中文论坛 (http://www.mysas.net/forum/)
Powered by Discuz! X3.2