|
|
楼主

楼主 |
发表于 2010-10-22 13:24:08
|
只看该作者
SAS MACRO SUMMARIZING VARIABLE INFORMATION
From Wensui Liu's blog
<font size="2"><span style="background-color:#ffffff"><font color="#0000ff">%macro</font></span> summ(<span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = );<br /><span style="background-color:#ffffff"><font color="#008000">****************************************************;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* THIS MACRO IS TO SUMMARIZE VARIABLES INFORMATION *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* IN A SAS DATA SET *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">****************************************************;</font></span><br /> <br /><span style="background-color:#ffffff"><font color="#0000ff">options</font></span> mprint mlogic orientation = landscape nodate nocenter nonumber;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc contents</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = <font color="#0000ff"><b>&data</b></font> <span style="background-color:#ffffff"><font color="#0000ff">varnum</font></span> out = _meta noprint;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> _nmeta (<span style="background-color:#ffffff"><font color="#0000ff">rename</font></span> = (index1 = i))<br /> _cmeta (<span style="background-color:#ffffff"><font color="#0000ff">rename</font></span> = (index2 = i));<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _last_ <span style="background-color:#ffffff"><font color="#0000ff">end</font></span> = eof;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> type = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> index1 + <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span> _nmeta;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">else</font></span> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> type = <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> index2 + <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span> _cmeta;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc sql</b></font></span> noprint;<br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span> <span style="background-color:#ffffff"><font color="#0000ff">max</font></span>(i) <span style="background-color:#ffffff"><font color="#0000ff">into</font></span> :num_cnt <span style="background-color:#ffffff"><font color="#0000ff">from</font></span> _nmeta;<br /> <br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span> <span style="background-color:#ffffff"><font color="#0000ff">max</font></span>(i) <span style="background-color:#ffffff"><font color="#0000ff">into</font></span> :cha_cnt <span style="background-color:#ffffff"><font color="#0000ff">from</font></span> _cmeta;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span> count(*) <span style="background-color:#ffffff"><font color="#0000ff">into</font></span> :cnt <span style="background-color:#ffffff"><font color="#0000ff">from</font></span> <font color="#0000ff"><b>&data</b></font>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>quit</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%local</font></span> num_cnt cha_cnt cnt;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%do</font></span> num_i = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">%to</font></span> <font color="#0000ff"><b>&num_cnt</b></font>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b> proc sql</b></font></span> noprint;<br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span> strip(<span style="background-color:#ffffff"><font color="#0000ff">upcase</font></span>(name)) <span style="background-color:#ffffff"><font color="#0000ff">into</font></span> :nx <span style="background-color:#ffffff"><font color="#0000ff">from</font></span> _nmeta <span style="background-color:#ffffff"><font color="#0000ff">where</font></span> i = <font color="#0000ff"><b>&num_i</b></font>;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span> <span style="background-color:#ffffff"><font color="#0000ff">n</font></span>(<span style="background-color:#ffffff"><font color="#0000ff">distinct</font></span> <font color="#0000ff"><b>&nx</b></font>) <span style="background-color:#ffffff"><font color="#0000ff">into</font></span> :dist <span style="background-color:#ffffff"><font color="#0000ff">from</font></span> <font color="#0000ff"><b>&data</b></font>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>quit</b></font></span>;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">%local</font></span> nx dist;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b> proc summary</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = <font color="#0000ff"><b>&data</b></font> nway;<br /> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span> out = _data_ (<span style="background-color:#ffffff"><font color="#0000ff">drop</font></span> = _freq_ _type_)<br /> <span style="background-color:#ffffff"><font color="#0000ff">n</font></span>(<font color="#0000ff"><b>&nx</b></font>) = cnt <span style="background-color:#ffffff"><font color="#0000ff">nmiss</font></span>(<font color="#0000ff"><b>&nx</b></font>) = mis<br /> <span style="background-color:#ffffff"><font color="#0000ff">min</font></span>(<font color="#0000ff"><b>&nx</b></font>) = xmin p25(<font color="#0000ff"><b>&nx</b></font>) = xp25 median(<font color="#0000ff"><b>&nx</b></font>) = xmdn<br /> p75(<font color="#0000ff"><b>&nx</b></font>) = xp75 <span style="background-color:#ffffff"><font color="#0000ff">max</font></span>(<font color="#0000ff"><b>&nx</b></font>) = xmax <span style="background-color:#ffffff"><font color="#0000ff">mean</font></span>(<font color="#0000ff"><b>&nx</b></font>) = xavg;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">%if</font></span> <font color="#0000ff"><b>&num_i</b></font> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">%then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> _nsumm;<br /> <span style="background-color:#ffffff"><font color="#0000ff">length</font></span> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> $<span style="background-color:#ffffff"><font color="#2e8b57"><b>32</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _last_;<br /> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> = <span style="background-color:#ffffff"><font color="#a020f0">"&nx"</font></span>;<br /> val_pct = cnt / <font color="#0000ff"><b>&cnt</b></font>;<br /> mis_pct = mis / <font color="#0000ff"><b>&cnt</b></font>;<br /> dis = <font color="#0000ff"><b>&dist</b></font>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">%else</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> _nsumm;<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _nsumm _last_ (<span style="background-color:#ffffff"><font color="#0000ff">in</font></span> = new);<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> new <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> = <span style="background-color:#ffffff"><font color="#a020f0">"&nx"</font></span>;<br /> val_pct = cnt / <font color="#0000ff"><b>&cnt</b></font>;<br /> mis_pct = mis / <font color="#0000ff"><b>&cnt</b></font>; <br /> dis = <font color="#0000ff"><b>&dist</b></font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>; <br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>; <br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%do</font></span> cha_i = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">%to</font></span> <font color="#0000ff"><b>&cha_cnt</b></font>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b> proc sql</b></font></span> noprint;<br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span> strip(<span style="background-color:#ffffff"><font color="#0000ff">upcase</font></span>(name)) <span style="background-color:#ffffff"><font color="#0000ff">into</font></span> :cx <span style="background-color:#ffffff"><font color="#0000ff">from</font></span> _cmeta <span style="background-color:#ffffff"><font color="#0000ff">where</font></span> i = <font color="#0000ff"><b>&cha_i</b></font>;<br /> <br /> <span style="background-color:#ffffff"><font color="#0000ff">create</font></span> <span style="background-color:#ffffff"><font color="#0000ff">table</font></span><br /> _level1 <span style="background-color:#ffffff"><font color="#0000ff">as</font></span><br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span><br /> <font color="#0000ff"><b>&cx</b></font> <span style="background-color:#ffffff"><font color="#0000ff">as</font></span> level,<br /> count(*) / <font color="#0000ff"><b>&cnt</b></font>. <span style="background-color:#ffffff"><font color="#0000ff">as</font></span> pct<br /> <span style="background-color:#ffffff"><font color="#0000ff">from</font></span><br /> <font color="#0000ff"><b>&data</b></font> <br /> <span style="background-color:#ffffff"><font color="#0000ff">group</font></span> <span style="background-color:#ffffff"><font color="#0000ff">by</font></span><br /> <font color="#0000ff"><b>&cx</b></font><br /> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span> <span style="background-color:#ffffff"><font color="#0000ff">by</font></span><br /> pct descending;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span> count(*) <span style="background-color:#ffffff"><font color="#0000ff">into</font></span> :level <span style="background-color:#ffffff"><font color="#0000ff">from</font></span> _level1;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span><br /> case when <span style="background-color:#ffffff"><font color="#0000ff">compress</font></span>(level, <span style="background-color:#ffffff"><font color="#a020f0">' '</font></span>) = <span style="background-color:#ffffff"><font color="#a020f0">''</font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#a020f0">'_'</font></span><br /> <span style="background-color:#ffffff"><font color="#0000ff">else</font></span> strip(level) <span style="background-color:#ffffff"><font color="#0000ff">end</font></span> ||<span style="background-color:#ffffff"><font color="#a020f0">"("</font></span>||strip(<span style="background-color:#ffffff"><font color="#0000ff">put</font></span>(pct, percent5.<span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span>))||<span style="background-color:#ffffff"><font color="#a020f0">")"</font></span><br /> <span style="background-color:#ffffff"><font color="#0000ff">into</font></span><br /> :tops separated <span style="background-color:#ffffff"><font color="#0000ff">by</font></span> <span style="background-color:#ffffff"><font color="#a020f0">', '</font></span><br /> <span style="background-color:#ffffff"><font color="#0000ff">from</font></span><br /> _level1(obs = <span style="background-color:#ffffff"><font color="#2e8b57"><b>5</b></font></span>);<br /> <span style="background-color:#ffffff"><font color="#000080"><b>quit</b></font></span>;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">%local</font></span> cx tops;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">%if</font></span> <font color="#0000ff"><b>&cha_i</b></font> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">%then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> _csumm;<br /> <span style="background-color:#ffffff"><font color="#0000ff">length</font></span> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> $<span style="background-color:#ffffff"><font color="#2e8b57"><b>32</b></font></span> tops $<span style="background-color:#ffffff"><font color="#2e8b57"><b>100</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> = <span style="background-color:#ffffff"><font color="#a020f0">"&cx"</font></span>;<br /> level = <font color="#0000ff"><b>&level</b></font>;<br /> tops = <span style="background-color:#ffffff"><font color="#a020f0">"&tops"</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">%else</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> _csumm;<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _csumm <span style="background-color:#ffffff"><font color="#0000ff">end</font></span> = eof;<br /> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> eof <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>; <br /> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> = <span style="background-color:#ffffff"><font color="#a020f0">"&cx"</font></span>;<br /> level = <font color="#0000ff"><b>&level</b></font>;<br /> tops = <span style="background-color:#ffffff"><font color="#a020f0">"&tops"</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>; <br /> <span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">title</font></span>;<br /><span style="background-color:#ffffff"><font color="#0000ff">%if</font></span> <font color="#0000ff"><b>&num_cnt</b></font> > <span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">%then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b> proc report</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _nsumm box spacing = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> split = <span style="background-color:#ffffff"><font color="#a020f0">"*"</font></span>;<br /> column(<span style="background-color:#ffffff"><font color="#a020f0">"SUMMARY OF NUMERIC VARIABLES (obs = %trim(&cnt))"</font></span><br /> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> val_pct mis_pct dis xmin xp25 xmdn xp75 xmax xavg);<br /> define <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> / <span style="background-color:#ffffff"><font color="#a020f0">"VARIABLE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>20</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span> = <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> center;<br /> define val_pct / <span style="background-color:#ffffff"><font color="#a020f0">"VALID*PERCENT"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = percent9.<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>;<br /> define mis_pct / <span style="background-color:#ffffff"><font color="#a020f0">"MISSING*PERCENT"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = percent9.<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>;<br /> define dis / <span style="background-color:#ffffff"><font color="#a020f0">"DISTINCT*VALUE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>9</b></font></span>.;<br /> define xmin / <span style="background-color:#ffffff"><font color="#a020f0">"MININUM"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span>;<br /> define xp25 / <span style="background-color:#ffffff"><font color="#a020f0">"1ST*QUANTILE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span>;<br /> define xmdn / <span style="background-color:#ffffff"><font color="#a020f0">"MEDIAN"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span>;<br /> define xp75 / <span style="background-color:#ffffff"><font color="#a020f0">"3RD*QUANTILE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span>;<br /> define xmax / <span style="background-color:#ffffff"><font color="#a020f0">"MAXIMUM"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span>; <br /> define xavg / <span style="background-color:#ffffff"><font color="#a020f0">"MEAN"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%if</font></span> <font color="#0000ff"><b>&cha_cnt</b></font> > <span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">%then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b> proc report</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _csumm box spacing = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> split = <span style="background-color:#ffffff"><font color="#a020f0">"*"</font></span>;<br /> column(<span style="background-color:#ffffff"><font color="#a020f0">"SUMMARY OF CHARACTER VARIABLES (obs = %trim(&cnt))"</font></span><br /> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> level tops);<br /> define <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> / <span style="background-color:#ffffff"><font color="#a020f0">"VARIABLE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>20</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span> = <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> center;<br /> define level / <span style="background-color:#ffffff"><font color="#a020f0">"# of*LEVELS"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span>;<br /> define tops / <span style="background-color:#ffffff"><font color="#a020f0">"TOP 5*CATEGORIES"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>100</b></font></span> center;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%mend</font></span> summ;<br /></font> |
|