<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Demographic chart in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Demographic-chart/m-p/92429#M19490</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Team,&lt;/P&gt;&lt;P&gt;I have a macro givven by one of our members. Its also for Demographics. But I am not knowing how to make the modifications to work for this kind of data.&lt;/P&gt;&lt;P&gt;I have used this macro before &lt;STRONG&gt;but not when the variable is further subdivided like the shown above&lt;/STRONG&gt;...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any help is highly appreciated&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;*options mprint symbolgen;&lt;BR /&gt;%macro table_char(dsetin, cont, cat, bin, dsetout);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;*delete old dataset;&lt;/P&gt;&lt;P&gt;proc datasets nodetails nolist;&lt;BR /&gt; delete &amp;amp;dsetout;&lt;BR /&gt;quit;&lt;/P&gt;&lt;P&gt;/****************************************************************&lt;BR /&gt; Handle Categorical Variables&lt;BR /&gt;****************************************************************/&lt;/P&gt;&lt;P&gt;*loop through variable list;&lt;BR /&gt;%let i=1;&lt;BR /&gt;%do %while (%scan(&amp;amp;cat, &amp;amp;i, " ") ^=%str());&lt;BR /&gt;%let var=%scan(&amp;amp;cat, &amp;amp;i, " "); &lt;BR /&gt; &lt;BR /&gt;*Get format for variable;&lt;BR /&gt;data _null_;&lt;BR /&gt; set &amp;amp;dsetin;&lt;BR /&gt; call symput("var_fmt", vformat(&amp;amp;var));&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc freq data=&amp;amp;dsetin noprint;&lt;BR /&gt; table &amp;amp;var/missing out=tab_var;&lt;BR /&gt; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data temp1;&lt;BR /&gt; length categorical $200.; format categorical $200.;&lt;BR /&gt; length value $200.; format value $200.;&lt;/P&gt;&lt;P&gt; set tab_var;&lt;BR /&gt; percent=percent/100;&lt;BR /&gt; categorical=put(&amp;amp;var., &amp;amp;var_fmt.);&lt;BR /&gt;&amp;nbsp; if _n_=1 then do;&lt;BR /&gt;&amp;nbsp; value=put(count, 8.)||"("||compress(put(percent, percent8.1))||")";&lt;BR /&gt;&amp;nbsp; order=2;&lt;BR /&gt;&amp;nbsp; output;&lt;BR /&gt;&amp;nbsp; order=1;&lt;BR /&gt;&amp;nbsp; value='';&lt;BR /&gt;&amp;nbsp; categorical=propcase(vlabel(&amp;amp;var.));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; output;&lt;BR /&gt; end;&lt;BR /&gt; else do;&lt;BR /&gt;&amp;nbsp; order=2;&lt;BR /&gt;&amp;nbsp; value=put(count, 8.)||"("||compress(put(percent, percent8.1))||")";&lt;BR /&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt; end;&lt;/P&gt;&lt;P&gt; keep categorical value order;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;proc sort data=temp1 out=temp2 (drop=order); by order categorical; run;&lt;BR /&gt; &lt;/P&gt;&lt;P&gt;proc append base=&amp;amp;dsetout data=temp2;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;*clean up;&lt;/P&gt;&lt;P&gt;proc datasets nodetails nolist;&lt;BR /&gt; delete tab_var temp1 temp2;&lt;BR /&gt;run; quit;&lt;/P&gt;&lt;P&gt;*Increment counter;&lt;BR /&gt;%let i=%eval(&amp;amp;i+1);&lt;BR /&gt;%end; *Categorical;&lt;BR /&gt; &lt;BR /&gt;/****************************************************************&lt;BR /&gt;Handle Continuous Variables&lt;BR /&gt;****************************************************************/&lt;/P&gt;&lt;P&gt;%let i=1;&lt;BR /&gt;%do %while (%scan(&amp;amp;cont, &amp;amp;i, " ") ^=%str());&lt;BR /&gt; %let var=%scan(&amp;amp;cont, &amp;amp;i, " "); &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc means data=&amp;amp;dsetin (rename=&amp;amp;var=vn) noprint;&lt;BR /&gt;var vn;&lt;BR /&gt;output out=table_var n= nmiss= mean= min= max= std= median= p25= p75= p90=/autoname;&lt;BR /&gt; run;&lt;/P&gt;&lt;P&gt;*get label of variable for clean reporting;&lt;BR /&gt;data _null_;&lt;BR /&gt; set &amp;amp;dsetin;&lt;BR /&gt; call symput("var_label", vlabel(&amp;amp;var));&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;data temp1;&lt;BR /&gt; length categorical $200.; format categorical $200.;&lt;BR /&gt;&amp;nbsp; format value $200.; length value $200.;&lt;/P&gt;&lt;P&gt; set table_var;&lt;/P&gt;&lt;P&gt; categorical="&amp;amp;var_label.";&lt;BR /&gt; value=.;&lt;BR /&gt; output;&lt;/P&gt;&lt;P&gt; categorical='Count(Missing)';&lt;BR /&gt; value=put(vn_n, 5.)||"("||compress(put(vn_nmiss, 5.))||")";&lt;BR /&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt; categorical='Mean (SD)';&lt;BR /&gt; value=put(vn_mean, 8.1)||"("||compress(put(vn_stddev, 8.1))||")";&lt;BR /&gt; output;&lt;/P&gt;&lt;P&gt; categorical='Median (IQR)';&lt;BR /&gt; value=put(vn_median, 8.1)||"("||compress(put(vn_p25, 8.1))||" - "||compress(put(vn_p75, 8.1))||")";&lt;BR /&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt; categorical='Range';&lt;BR /&gt; value=put(vn_min, 8.1)||" - "||compress(put(vn_max, 8.1));&lt;BR /&gt; output;&lt;/P&gt;&lt;P&gt; categorical='90th Percentile';&lt;BR /&gt; value=put(vn_p90, 8.1);&lt;BR /&gt; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt; keep categorical value;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;proc append base=&amp;amp;dsetout data=temp1;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;*clean up;&lt;/P&gt;&lt;P&gt;proc datasets nodetails nolist;&lt;BR /&gt; delete table_var temp1;&lt;BR /&gt;run; quit;&lt;/P&gt;&lt;P&gt;*Increment counter;&lt;BR /&gt; %let i=%eval(&amp;amp;i+1);&lt;BR /&gt;%end; *Continuous;&lt;/P&gt;&lt;P&gt;/*****************************************************************&lt;BR /&gt;Handle Binary Variables (only report 1s)&lt;BR /&gt;*****************************************************************/&lt;BR /&gt; &lt;BR /&gt;%let i=1;&lt;BR /&gt;%do %while (%scan(&amp;amp;bin, &amp;amp;i, " ") ^=%str());&lt;BR /&gt;%let var=%scan(&amp;amp;bin, &amp;amp;i, " "); &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc freq data=&amp;amp;dsetin noprint;&lt;BR /&gt; table &amp;amp;var/missing out=tab_var;&lt;BR /&gt; run;&lt;/P&gt;&lt;P&gt;data tab_var;&lt;BR /&gt; set tab_var;&lt;BR /&gt; where &amp;amp;var=1;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;data temp1;&lt;BR /&gt; length categorical $200.; format categorical $200.;&lt;BR /&gt; length value $200.; format value $200.;&lt;/P&gt;&lt;P&gt; set tab_var;&lt;BR /&gt; percent=percent/100;&lt;BR /&gt;&amp;nbsp; if _n_=1 then do;&lt;BR /&gt;&amp;nbsp; value=put(count, 8.)||"("||compress(put(percent, percent8.1))||")";&lt;BR /&gt;&amp;nbsp; order=1;&lt;BR /&gt;&amp;nbsp; categorical=propcase(vlabel(&amp;amp;var.));&lt;BR /&gt;&amp;nbsp; output;&lt;BR /&gt; end;&lt;BR /&gt; keep categorical value;&lt;BR /&gt; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;proc append base=&amp;amp;dsetout data=temp1;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;*clean up;&lt;/P&gt;&lt;P&gt;proc datasets nodetails nolist;&lt;BR /&gt; delete tab_var temp1;&lt;BR /&gt;run; quit;&lt;/P&gt;&lt;P&gt;*Increment counter;&lt;BR /&gt;%let i=%eval(&amp;amp;i+1);&lt;BR /&gt; %end;*Binary;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;%mend table_char;&lt;/P&gt;&lt;P&gt;%table_char(sample, height weight age, sex age, female, sample_table_char);&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 11 Oct 2012 16:39:18 GMT</pubDate>
    <dc:creator>robertrao</dc:creator>
    <dc:date>2012-10-11T16:39:18Z</dc:date>
    <item>
      <title>Demographic chart</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Demographic-chart/m-p/92428#M19489</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Team,&lt;/P&gt;&lt;P&gt;If a procedure variable&amp;nbsp; is&amp;nbsp; "Y" it can take the values of "b" or "h" in the type variable&lt;/P&gt;&lt;P&gt;Could someone help me produce these results&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;pt&amp;nbsp;&amp;nbsp; Procedure&amp;nbsp;&amp;nbsp; type&lt;/P&gt;&lt;P&gt; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b&lt;/P&gt;&lt;P&gt;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp; y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp; y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp; y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp; y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n/a&lt;/P&gt;&lt;P&gt;&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n/a&lt;/P&gt;&lt;P&gt;sevaral hundreds of records&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;run&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;I WANT THE OUTPUT LIKE THIS with Percentages in braces for categorical variables. There are many variable like this sample shown below &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type(b/h)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type n/a&amp;nbsp;&amp;nbsp;&amp;nbsp; TOTAL&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Age, years&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n=?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n=?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n= ?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n=?&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Mean (SD)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Median&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Min-Max&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13-45&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 45-60&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;BMI&lt;/P&gt;&lt;P&gt;Mean (SD)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Median&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Min-Max&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Diabetes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Smoking&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;current&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40(40%)&amp;nbsp;&amp;nbsp; 60(60%)&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Former&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 60(60%)&amp;nbsp;&amp;nbsp;&amp;nbsp; 40(40%)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Gender&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Male&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Female&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;HTN&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;yes&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;no&amp;nbsp;&amp;nbsp; &lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 11 Oct 2012 16:27:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Demographic-chart/m-p/92428#M19489</guid>
      <dc:creator>robertrao</dc:creator>
      <dc:date>2012-10-11T16:27:38Z</dc:date>
    </item>
    <item>
      <title>Re: Demographic chart</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Demographic-chart/m-p/92429#M19490</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Team,&lt;/P&gt;&lt;P&gt;I have a macro givven by one of our members. Its also for Demographics. But I am not knowing how to make the modifications to work for this kind of data.&lt;/P&gt;&lt;P&gt;I have used this macro before &lt;STRONG&gt;but not when the variable is further subdivided like the shown above&lt;/STRONG&gt;...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any help is highly appreciated&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;*options mprint symbolgen;&lt;BR /&gt;%macro table_char(dsetin, cont, cat, bin, dsetout);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;*delete old dataset;&lt;/P&gt;&lt;P&gt;proc datasets nodetails nolist;&lt;BR /&gt; delete &amp;amp;dsetout;&lt;BR /&gt;quit;&lt;/P&gt;&lt;P&gt;/****************************************************************&lt;BR /&gt; Handle Categorical Variables&lt;BR /&gt;****************************************************************/&lt;/P&gt;&lt;P&gt;*loop through variable list;&lt;BR /&gt;%let i=1;&lt;BR /&gt;%do %while (%scan(&amp;amp;cat, &amp;amp;i, " ") ^=%str());&lt;BR /&gt;%let var=%scan(&amp;amp;cat, &amp;amp;i, " "); &lt;BR /&gt; &lt;BR /&gt;*Get format for variable;&lt;BR /&gt;data _null_;&lt;BR /&gt; set &amp;amp;dsetin;&lt;BR /&gt; call symput("var_fmt", vformat(&amp;amp;var));&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc freq data=&amp;amp;dsetin noprint;&lt;BR /&gt; table &amp;amp;var/missing out=tab_var;&lt;BR /&gt; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data temp1;&lt;BR /&gt; length categorical $200.; format categorical $200.;&lt;BR /&gt; length value $200.; format value $200.;&lt;/P&gt;&lt;P&gt; set tab_var;&lt;BR /&gt; percent=percent/100;&lt;BR /&gt; categorical=put(&amp;amp;var., &amp;amp;var_fmt.);&lt;BR /&gt;&amp;nbsp; if _n_=1 then do;&lt;BR /&gt;&amp;nbsp; value=put(count, 8.)||"("||compress(put(percent, percent8.1))||")";&lt;BR /&gt;&amp;nbsp; order=2;&lt;BR /&gt;&amp;nbsp; output;&lt;BR /&gt;&amp;nbsp; order=1;&lt;BR /&gt;&amp;nbsp; value='';&lt;BR /&gt;&amp;nbsp; categorical=propcase(vlabel(&amp;amp;var.));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; output;&lt;BR /&gt; end;&lt;BR /&gt; else do;&lt;BR /&gt;&amp;nbsp; order=2;&lt;BR /&gt;&amp;nbsp; value=put(count, 8.)||"("||compress(put(percent, percent8.1))||")";&lt;BR /&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt; end;&lt;/P&gt;&lt;P&gt; keep categorical value order;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;proc sort data=temp1 out=temp2 (drop=order); by order categorical; run;&lt;BR /&gt; &lt;/P&gt;&lt;P&gt;proc append base=&amp;amp;dsetout data=temp2;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;*clean up;&lt;/P&gt;&lt;P&gt;proc datasets nodetails nolist;&lt;BR /&gt; delete tab_var temp1 temp2;&lt;BR /&gt;run; quit;&lt;/P&gt;&lt;P&gt;*Increment counter;&lt;BR /&gt;%let i=%eval(&amp;amp;i+1);&lt;BR /&gt;%end; *Categorical;&lt;BR /&gt; &lt;BR /&gt;/****************************************************************&lt;BR /&gt;Handle Continuous Variables&lt;BR /&gt;****************************************************************/&lt;/P&gt;&lt;P&gt;%let i=1;&lt;BR /&gt;%do %while (%scan(&amp;amp;cont, &amp;amp;i, " ") ^=%str());&lt;BR /&gt; %let var=%scan(&amp;amp;cont, &amp;amp;i, " "); &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc means data=&amp;amp;dsetin (rename=&amp;amp;var=vn) noprint;&lt;BR /&gt;var vn;&lt;BR /&gt;output out=table_var n= nmiss= mean= min= max= std= median= p25= p75= p90=/autoname;&lt;BR /&gt; run;&lt;/P&gt;&lt;P&gt;*get label of variable for clean reporting;&lt;BR /&gt;data _null_;&lt;BR /&gt; set &amp;amp;dsetin;&lt;BR /&gt; call symput("var_label", vlabel(&amp;amp;var));&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;data temp1;&lt;BR /&gt; length categorical $200.; format categorical $200.;&lt;BR /&gt;&amp;nbsp; format value $200.; length value $200.;&lt;/P&gt;&lt;P&gt; set table_var;&lt;/P&gt;&lt;P&gt; categorical="&amp;amp;var_label.";&lt;BR /&gt; value=.;&lt;BR /&gt; output;&lt;/P&gt;&lt;P&gt; categorical='Count(Missing)';&lt;BR /&gt; value=put(vn_n, 5.)||"("||compress(put(vn_nmiss, 5.))||")";&lt;BR /&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt; categorical='Mean (SD)';&lt;BR /&gt; value=put(vn_mean, 8.1)||"("||compress(put(vn_stddev, 8.1))||")";&lt;BR /&gt; output;&lt;/P&gt;&lt;P&gt; categorical='Median (IQR)';&lt;BR /&gt; value=put(vn_median, 8.1)||"("||compress(put(vn_p25, 8.1))||" - "||compress(put(vn_p75, 8.1))||")";&lt;BR /&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt; categorical='Range';&lt;BR /&gt; value=put(vn_min, 8.1)||" - "||compress(put(vn_max, 8.1));&lt;BR /&gt; output;&lt;/P&gt;&lt;P&gt; categorical='90th Percentile';&lt;BR /&gt; value=put(vn_p90, 8.1);&lt;BR /&gt; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt; keep categorical value;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;proc append base=&amp;amp;dsetout data=temp1;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;*clean up;&lt;/P&gt;&lt;P&gt;proc datasets nodetails nolist;&lt;BR /&gt; delete table_var temp1;&lt;BR /&gt;run; quit;&lt;/P&gt;&lt;P&gt;*Increment counter;&lt;BR /&gt; %let i=%eval(&amp;amp;i+1);&lt;BR /&gt;%end; *Continuous;&lt;/P&gt;&lt;P&gt;/*****************************************************************&lt;BR /&gt;Handle Binary Variables (only report 1s)&lt;BR /&gt;*****************************************************************/&lt;BR /&gt; &lt;BR /&gt;%let i=1;&lt;BR /&gt;%do %while (%scan(&amp;amp;bin, &amp;amp;i, " ") ^=%str());&lt;BR /&gt;%let var=%scan(&amp;amp;bin, &amp;amp;i, " "); &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc freq data=&amp;amp;dsetin noprint;&lt;BR /&gt; table &amp;amp;var/missing out=tab_var;&lt;BR /&gt; run;&lt;/P&gt;&lt;P&gt;data tab_var;&lt;BR /&gt; set tab_var;&lt;BR /&gt; where &amp;amp;var=1;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;data temp1;&lt;BR /&gt; length categorical $200.; format categorical $200.;&lt;BR /&gt; length value $200.; format value $200.;&lt;/P&gt;&lt;P&gt; set tab_var;&lt;BR /&gt; percent=percent/100;&lt;BR /&gt;&amp;nbsp; if _n_=1 then do;&lt;BR /&gt;&amp;nbsp; value=put(count, 8.)||"("||compress(put(percent, percent8.1))||")";&lt;BR /&gt;&amp;nbsp; order=1;&lt;BR /&gt;&amp;nbsp; categorical=propcase(vlabel(&amp;amp;var.));&lt;BR /&gt;&amp;nbsp; output;&lt;BR /&gt; end;&lt;BR /&gt; keep categorical value;&lt;BR /&gt; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;proc append base=&amp;amp;dsetout data=temp1;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;*clean up;&lt;/P&gt;&lt;P&gt;proc datasets nodetails nolist;&lt;BR /&gt; delete tab_var temp1;&lt;BR /&gt;run; quit;&lt;/P&gt;&lt;P&gt;*Increment counter;&lt;BR /&gt;%let i=%eval(&amp;amp;i+1);&lt;BR /&gt; %end;*Binary;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;%mend table_char;&lt;/P&gt;&lt;P&gt;%table_char(sample, height weight age, sex age, female, sample_table_char);&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 11 Oct 2012 16:39:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Demographic-chart/m-p/92429#M19490</guid>
      <dc:creator>robertrao</dc:creator>
      <dc:date>2012-10-11T16:39:18Z</dc:date>
    </item>
  </channel>
</rss>

