SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1502|回复: 2
打印 上一主题 下一主题

把每个变量的value label生成数据集

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-10-27 16:37:51 | 只看该作者

把每个变量的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 -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2012-5-27 11:39:15 | 只看该作者

Re: 把每个变量的value label生成数据集

一般情况下,proc contents 是能把标签储存为数据集的,如果不能,这的确是个有趣的问题,希望楼主再看到这个帖子是,提供原始数据,以便我们进一步测试实验。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2012-5-27 14:51:35 | 只看该作者

Re: 把每个变量的value label生成数据集

[code:2zh9vm59]
libname myfmt &quot;c&#58;\covance&quot;;
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&#46; id seq&#46;;
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(&amp;libn);
%let indsn=%upcase(&amp;indsn);
%if %sysfunc(exist(&amp;libn&#46;&#46;&amp;indsn))=0 %then %do;
    %put WARNING-*** DATASET &amp;libn&#46;&#46;&amp;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(&quot;&amp;fmtSearchSeq&quot;,libname) as seq
            from dictionary&#46;catalogs
                where objtype='FORMAT' and
                    objname in (select tranwrd(format,'&#46;','') from dictionary&#46;columns
                        where libname=&quot;&amp;libn&quot; and memname=&quot;&amp;indsn&quot;)
                    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&#46;libname);
        set fmtList;
        by libname;
        fmtList=catx(' ',fmtList,objname);
    end;
run;
%if &amp;sqlobs=0 %then %do;
    %put WARNING-*** USER DEFINED-FORMAT DOES NOT EXIST! ***;
    %goto exist;
%end;
%else %if %sysfunc(exist(&amp;libn&#46;&#46;&amp;outdsn)) %then %str(proc delete data=&amp;libn&#46;&#46;&amp;outdsn;run;);
%let dsid=%sysfunc(open(work&#46;fmtList,i));
%let num=%sysfunc(attrn(&amp;dsid,nlobs));
%if &amp;num gt 0 %then %do;
    %syscall set(dsid);
    %do i=1 %to &amp;num;
        %let rc=%sysfunc(fetchobs(&amp;dsid,&amp;i));
        proc format library=&amp;libname cntlout=work&#46;_temp;
            select &amp;fmtList;
        run;
        proc append base=work&#46;out data=work&#46;_temp; run;
    %end;
%end;
%let rc=%sysfunc(close(&amp;dsid));
proc delete data=fmtList _temp; run;
%if &amp;rc=0 %then %put WARNING-*** SUCCESSFUL EXECUTED! ***;
%exist&#58;
options &amp;mprintState;
%mend searchFormat;

%searchFormat(indsn=raw)[/code:2zh9vm59]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-6 12:58 , Processed in 0.068073 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表