[R] Tables Package Grouping Factors
Duncan Murdoch
murdoch.duncan at gmail.com
Sat Nov 9 20:03:23 CET 2013
On 13-11-09 1:23 PM, Jeff Newmiller wrote:
> Visually, the elimination of duplicates in hierarchical tables in the
> tabular function from the tables package is very nice. I would like to do
> the same thing with non-crossed factors, but am perhaps missing some
> conceptual element of how this package is used. The following code
> illustrates my goal (I hope):
>
> library(tables)
> sampledf <- data.frame( Sex=rep(c("M","F"),each=6)
> , Name=rep(c("John","Joe","Mark","Alice","Beth","Jane"),each=2)
> , When=rep(c("Before","After"),times=6)
> , Weight=c(180,190,190,180,200,200,140,145,150,140,135,135)
> )
> sampledf$SexName <- factor( paste( sampledf$Sex, sampledf$Name ) )
>
> # logically, this is the layout
> tabular( Name ~ Heading()* When * Weight * Heading()*identity,
> data=sampledf )
>
> # but I want to augment the Name with the Sex but visually group the
> # Sex like
> # tabular( Sex*Name ~ Heading()*When * Weight * Heading()*identity,
> data=sampledf )
> # would except that there really is no crossing between sexes.
> tabular( SexName ~ Heading()*When * Weight * Heading()*identity,
> data=sampledf )
> # this repeats the Sex category excessively.
I don't think it's easy to get what you want. The basic assumption is
that factors are crossed.
One hack that would get you what you want in this case is to make up a
new variable representing person within sex (running from 1 to 3), then
treating the Name as a statistic. Of course, this won't work if you
don't have equal numbers of each sex.
A better solution is more cumbersome, and only works in LaTeX (and maybe
HTML). Draw two tables, first for the female subset, then for the male
subset. Put out the headers only on the first one and the footer only
on the second, and it will be typeset as one big table.
You'll have to fight with the fact that the factors Sex and Name
remember their levels whether they are present or not, but it should
work. For example,
sampledf$Sex <- as.character(sampledf$Sex)
sampledf$Name <- as.character(sampledf$Name)
females <- subset(sampledf, Sex == "F")
males <- subset(sampledf, Sex == "M")
latex( tabular( Factor(Sex)*Factor(Name) ~ Heading()*When * Weight *
Heading()*identity, data=females),
options = list(doFooter=FALSE, doEnd=FALSE) )
latex( tabular( Factor(Sex)*Factor(Name) ~ Heading()*When * Weight *
Heading()*identity, data=males),
options = list(doBegin=FALSE, doHeader=FALSE) )
It would probably make sense to support nested factor notation using
%in% to make this easier, but currently tables doesn't do that.
Duncan Murdoch
More information about the R-help
mailing list