[R] Table with n(%) formatting: A better way to do this?
murdoch.duncan at gmail.com
Wed Apr 10 18:36:56 CEST 2013
On 10/04/2013 11:59 AM, Paul Miller wrote:
> Hello All,
> Am learning to create tables with n(%) formatting using R. Below is a working example. I think this is not bad but wondered if there are better ways of doing it. Although it can be quite humbling, seeing good code helps me assess my progress as an R programmer.
> Ultimately want to have code that I can turn into a function. Will then use the output produced to make tables using odfWeave and Sweave/knitr.
> breaks <- as.data.frame(lapply(warpbreaks, function(x) rep(x, warpbreaks$breaks)))
> Freq <- with(breaks, addmargins(table(wool, tension), 2))
> Prop <- round( prop.table(Freq, 2) * 100, 2 )
> Freq <- addmargins(Freq, 1)
> Prop <- addmargins(Prop, 1)
> class(Freq) <- "character"
> class(Prop) <- "character"
> FreqProp <- matrixPaste(Freq, "(", Prop, "%)", sep = c("", "", ""))
> colnames(FreqProp) <- colnames(Freq)
> rownames(FreqProp) <- rownames(Freq)
> names(dimnames(FreqProp)) <- c("Wool", "")
> FreqProp <- data.frame(Wool=rownames(FreqProp), FreqProp, row.names=NULL, stringsAsFactors=FALSE)
> names(FreqProp)[names(FreqProp) == "Sum"] <- "Total"
> FreqProp$Wool[FreqProp$Wool == "Sum"] <- "Total"
This might not be very useful for you, but the tables package can
calculate proportions and percentages directly from the data. It can
produce LaTeX output, but doesn't have formatting functions for HTML or
odf. Still, you might use it for the computing, then output .csv and
format it later. For example, you get a table something like the one
produced above from the breaks dataframe using
tabular((wool + 1) ~ (tension + 1)*((Count=1) + Percent("col")),
It's possible to get the formatting closer to what you had with
fiddling, but not easy to do it in a way that looks good in all possible
More information about the R-help