Using PROC TABULATE, in a table that has two levels of columns headings, is there a way to get vertical borders between the major headings, that extend through the entire table?
Below I can specify a border on the CLASSLEV statement, but it only applies to the heading, it is not actually inherited by the table.
ods pdf file="%sysfunc(pathname(work))/foo.pdf" style=journal;
proc tabulate data=sashelp.class ;
class name age sex;
classlev sex/style={borderrightcolor=red borderrightwidth=2} ;
tables name="",sex=""*age="";
where age IN (13,14) ;
run ;
ods pdf close ;
It generates:
I would like the red lines to extend down through the entire table, to separate the gender groups.
Perhaps this can be done with inheritance?
Thanks @Kathryn_SAS , helpful examples.
Luckily for me, my actual example is different than I posted. Within the gender columns, I calculate a mean and std dev. This allows me to specify a border on the std dev column, e.g.:
ods pdf file="%sysfunc(pathname(work))/foo.pdf" style=journal;
proc tabulate data=sashelp.class ;
class name sex;
var height ;
classlev sex/style={borderrightcolor=red borderrightwidth=2} ;
tables name="",sex=""*height=""*(mean stddev*{style={borderrightcolor=red borderrightwidth=2}});
keyword stddev/style={borderrightcolor=red borderrightwidth=2} ;
where age IN (13,14) ;
run ;
ods pdf close ;
With style inheritance, you will get more borders than you want. I tried PROC REPORT, and the trick is getting only 14 to have a right border. You can see the two attempts I tried below, which still does not give you exactly what you describe. I think you can adapt this SAS Note which requires creating multiple formats:
https://support.sas.com/kb/39/652.html
ods listing close;
ods escapechar='^';
ods pdf file="c:\temp\foo.pdf" style=journal;
proc tabulate data=sashelp.class ;
class name sex;
class age / style=<parent>;
classlev sex/style={borderrightcolor=red borderrightwidth=2} ;
classlev age/ style=<parent>;
tables name="",sex=""*age=""*[style=<parent>];
where age IN (13,14) ;
keyword n / style=<parent>;
run ;
proc report data=sashelp.class missing;
column name sex,((age,n)) dummy ;
define name / ' ' group;
define sex / across ' ' style(header)=[borderrightcolor=red borderrightwidth=2];
define age / across ' ' style(header)=[borderrightcolor=red borderrightwidth=2];
define n / ' ';
define dummy / computed noprint;
where age IN (13,14) ;
compute dummy;
call define('_c3_','style','style=[borderrightcolor=red borderrightwidth=2]');
call define('_c5_','style','style=[borderrightcolor=red borderrightwidth=2]');
endcomp;
run;
data class;
set sashelp.class;
blankcol=1;
run;
proc report data=class missing;
column name sex,((age,n) blankcol);
define name / ' ' group;
define sex / across ' ' style(header)=[borderrightcolor=red borderrightwidth=2];
define age / across ' ' ;
define n / ' ';
define blankcol / ' ' style(column header)=[foreground=red background=red cellwidth=.1in];
where age IN (13,14) ;
run;
ods pdf close ;
ods listing;
Thanks @Kathryn_SAS , helpful examples.
Luckily for me, my actual example is different than I posted. Within the gender columns, I calculate a mean and std dev. This allows me to specify a border on the std dev column, e.g.:
ods pdf file="%sysfunc(pathname(work))/foo.pdf" style=journal;
proc tabulate data=sashelp.class ;
class name sex;
var height ;
classlev sex/style={borderrightcolor=red borderrightwidth=2} ;
tables name="",sex=""*height=""*(mean stddev*{style={borderrightcolor=red borderrightwidth=2}});
keyword stddev/style={borderrightcolor=red borderrightwidth=2} ;
where age IN (13,14) ;
run ;
ods pdf close ;
Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.