PercTable.Rd
Prints a 2-way contingency table along with percentages, marginal, and conditional distributions. All the frequencies are nested into one single table.
# Default S3 method
PercTable(x, y = NULL, ...)
# S3 method for class 'table'
PercTable(tab, row.vars = NULL, col.vars = NULL, justify = "right",
freq = TRUE, rfrq = "100", expected = FALSE, residuals = FALSE,
stdres = FALSE, margins = NULL, digits = NULL, ...)
# S3 method for class 'formula'
PercTable(formula, data, subset, na.action, ...)
# S3 method for class 'PercTable'
print(x, vsep = NULL, ...)
Margins(tab, ...)
objects which can be interpreted as factors (including character strings).
x and y will be tabulated via table(x, y)
.
If x is a matrix, it will be coerced to a table via as.table(x).
a r x c-contingency table
a vector of row variables (see Details).
a vector of column variables (see Details). If this is left to NULL
the table structure will be preserved.
either "left"
or "right"
for defining the alignment of the table cells.
boolean. Should absolute frequencies be included? Defaults to TRUE.
a string with 3 characters, each of them being 1 or 0. The first position means total percentages, the second means row percentages and the third column percentages. "011" produces a table output with row and column percentages.
the expected counts under the null hypothesis.
the Pearson residuals, (observed - expected) / sqrt(expected).
standardized residuals, (observed - expected) / sqrt(V), where V is the residual cell variance (for the case where x is a matrix, n * p * (1 - p) otherwise).
a vector, consisting out of 1 and/or 2. Defines the margin sums to be included.
1 stands for row margins, 2 for column margins, c(1,2) for both. Default is NULL
(none).
integer. With how many digits shoud the relative frequencies be formatted? Default can be set by DescToolsOptions(digits=x)
.
a formula of the form lhs ~ rhs
where lhs
will be tabled versus rhs (table(lhs, rhs)
).
an optional matrix or data frame (or similar: see model.frame
) containing the variables in the formula formula
.
By default the variables are taken from environment(formula)
.
an optional vector specifying a subset of observations to be used.
a function which indicates what should happen when the data contain NAs. Defaults to getOption("na.action")
.
logical, defining if an empty row should be introduced between the table rows. Default is FALSE, if only a table with one single description (either frequencies or percents) should be returned and TRUE
in any other case.
the dots are passed from PercTable.default()
to PercTable.table()
and from Margins
to the function Freq
.
PercTable prints a 2-dimensional table. The absolute and relative frequencies are nested into one flat table by means of ftable
.
row.vars
, resp. col.vars
can be used to define the structure of the table. row.vars
can either be the names of
the dimensions (included percentages are named "idx"
) or numbers (1:3, where 1 is the first dimension of the table,
2 the second and 3 the percentages).
Use Sort()
if you want to have your table sorted by rows.
The style in which numbers are formatted is selected by
Fmt()
from the DescTools options.
Absolute frequencies will use Fmt("abs")
and Fmt("per")
will do it for the percentages. The options can be changed with Fmt(abs=as.fmt(...))
which is basically a "fmt"
-object containing any format information used in Format
.
Margins()
returns a list containing all the one dimensional margin tables of a n-dimensional table along the given dimensions. It uses margin.table()
for all the dimensions and adds the appropriate percentages.
Returns an object of class "ftable"
.
Agresti, Alan (2007) Introduction to categorical data analysis. NY: John Wiley and Sons, Section 2.4.5
Freq
, table
, ftable
, prop.table
, addmargins
, DescToolsOptions
, Fmt
There are similar functions in package sfsmisc printTable2
and package vcd table2d_summary
, both
lacking some of the flexibility we needed here.
tab <- table(driver=d.pizza$driver, area=d.pizza$area)
PercTable(tab=tab, col.vars=2)
#>
#> area Brent Camden Westminster
#> driver
#>
#> Butcher freq 72 1 22
#> perc 6.0% 0.1% 1.8%
#>
#> Carpenter freq 29 19 221
#> perc 2.4% 1.6% 18.5%
#>
#> Carter freq 177 47 5
#> perc 14.8% 3.9% 0.4%
#>
#> Farmer freq 19 87 11
#> perc 1.6% 7.3% 0.9%
#>
#> Hunter freq 128 4 24
#> perc 10.7% 0.3% 2.0%
#>
#> Miller freq 6 41 77
#> perc 0.5% 3.4% 6.4%
#>
#> Taylor freq 42 142 20
#> perc 3.5% 11.9% 1.7%
#>
PercTable(tab=tab, col.vars=2, margins=c(1,2))
#>
#> area Brent Camden Westminster Sum
#> driver
#>
#> Butcher freq 72 1 22 95
#> perc 6.0% 0.1% 1.8% 8.0%
#>
#> Carpenter freq 29 19 221 269
#> perc 2.4% 1.6% 18.5% 22.5%
#>
#> Carter freq 177 47 5 229
#> perc 14.8% 3.9% 0.4% 19.2%
#>
#> Farmer freq 19 87 11 117
#> perc 1.6% 7.3% 0.9% 9.8%
#>
#> Hunter freq 128 4 24 156
#> perc 10.7% 0.3% 2.0% 13.1%
#>
#> Miller freq 6 41 77 124
#> perc 0.5% 3.4% 6.4% 10.4%
#>
#> Taylor freq 42 142 20 204
#> perc 3.5% 11.9% 1.7% 17.1%
#>
#> Sum freq 473 341 380 1'194
#> perc 39.6% 28.6% 31.8% 100.0%
#>
PercTable(tab=tab, col.vars=2, margins=2)
#>
#> area Brent Camden Westminster
#> driver
#>
#> Butcher freq 72 1 22
#> perc 6.0% 0.1% 1.8%
#>
#> Carpenter freq 29 19 221
#> perc 2.4% 1.6% 18.5%
#>
#> Carter freq 177 47 5
#> perc 14.8% 3.9% 0.4%
#>
#> Farmer freq 19 87 11
#> perc 1.6% 7.3% 0.9%
#>
#> Hunter freq 128 4 24
#> perc 10.7% 0.3% 2.0%
#>
#> Miller freq 6 41 77
#> perc 0.5% 3.4% 6.4%
#>
#> Taylor freq 42 142 20
#> perc 3.5% 11.9% 1.7%
#>
#> Sum freq 473 341 380
#> perc 39.6% 28.6% 31.8%
#>
PercTable(tab=tab, col.vars=2, margins=1)
#>
#> area Brent Camden Westminster Sum
#> driver
#>
#> Butcher freq 72 1 22 95
#> perc 6.0% 0.1% 1.8% 8.0%
#>
#> Carpenter freq 29 19 221 269
#> perc 2.4% 1.6% 18.5% 22.5%
#>
#> Carter freq 177 47 5 229
#> perc 14.8% 3.9% 0.4% 19.2%
#>
#> Farmer freq 19 87 11 117
#> perc 1.6% 7.3% 0.9% 9.8%
#>
#> Hunter freq 128 4 24 156
#> perc 10.7% 0.3% 2.0% 13.1%
#>
#> Miller freq 6 41 77 124
#> perc 0.5% 3.4% 6.4% 10.4%
#>
#> Taylor freq 42 142 20 204
#> perc 3.5% 11.9% 1.7% 17.1%
#>
PercTable(tab=tab, col.vars=2, margins=NULL)
#>
#> area Brent Camden Westminster
#> driver
#>
#> Butcher freq 72 1 22
#> perc 6.0% 0.1% 1.8%
#>
#> Carpenter freq 29 19 221
#> perc 2.4% 1.6% 18.5%
#>
#> Carter freq 177 47 5
#> perc 14.8% 3.9% 0.4%
#>
#> Farmer freq 19 87 11
#> perc 1.6% 7.3% 0.9%
#>
#> Hunter freq 128 4 24
#> perc 10.7% 0.3% 2.0%
#>
#> Miller freq 6 41 77
#> perc 0.5% 3.4% 6.4%
#>
#> Taylor freq 42 142 20
#> perc 3.5% 11.9% 1.7%
#>
PercTable(tab=tab, col.vars=2, rfrq="000")
#>
#> area Brent Camden Westminster
#> driver
#> Butcher 72 1 22
#> Carpenter 29 19 221
#> Carter 177 47 5
#> Farmer 19 87 11
#> Hunter 128 4 24
#> Miller 6 41 77
#> Taylor 42 142 20
# just the percentages without absolute values
PercTable(tab=tab, col.vars=2, rfrq="110", freq=FALSE)
#>
#> area Brent Camden Westminster
#> driver
#>
#> Butcher perc 6.0% 0.1% 1.8%
#> p.row 75.8% 1.1% 23.2%
#>
#> Carpenter perc 2.4% 1.6% 18.5%
#> p.row 10.8% 7.1% 82.2%
#>
#> Carter perc 14.8% 3.9% 0.4%
#> p.row 77.3% 20.5% 2.2%
#>
#> Farmer perc 1.6% 7.3% 0.9%
#> p.row 16.2% 74.4% 9.4%
#>
#> Hunter perc 10.7% 0.3% 2.0%
#> p.row 82.1% 2.6% 15.4%
#>
#> Miller perc 0.5% 3.4% 6.4%
#> p.row 4.8% 33.1% 62.1%
#>
#> Taylor perc 3.5% 11.9% 1.7%
#> p.row 20.6% 69.6% 9.8%
#>
# just the row percentages in percent format (pfmt = TRUE)
PercTable(tab, freq= FALSE, rfrq="010", pfmt=TRUE, digits=1)
#>
#> area Brent Camden Westminster
#> driver
#> Butcher 75.8% 1.1% 23.2%
#> Carpenter 10.8% 7.1% 82.2%
#> Carter 77.3% 20.5% 2.2%
#> Farmer 16.2% 74.4% 9.4%
#> Hunter 82.1% 2.6% 15.4%
#> Miller 4.8% 33.1% 62.1%
#> Taylor 20.6% 69.6% 9.8%
# just the expected frequencies and the standard residuals
PercTable(tab=tab, rfrq="000", expected = TRUE, stdres = TRUE)
#>
#> area Brent Camden Westminster
#> driver
#>
#> Butcher freq 72 1 22
#> exp 37.634 27.131 30.235
#> stdres 7.514 -6.187 -1.891
#>
#> Carpenter freq 29 19 221
#> exp 106.564 76.825 85.611
#> stdres -10.985 -8.868 20.134
#>
#> Carter freq 177 47 5
#> exp 90.718 65.401 72.881
#> stdres 12.967 -2.994 -10.712
#>
#> Farmer freq 19 87 11
#> exp 46.349 33.415 37.236
#> stdres -5.443 11.548 -5.483
#>
#> Hunter freq 128 4 24
#> exp 61.799 44.553 49.648
#> stdres 11.623 -7.709 -4.728
#>
#> Miller freq 6 41 77
#> exp 49.122 35.414 39.464
#> stdres -8.364 1.173 7.644
#>
#> Taylor freq 42 142 20
#> exp 80.814 58.261 64.925
#> stdres -6.102 14.254 -7.416
#>
# rearrange output such that freq are inserted as columns instead of rows
PercTable(tab=tab, col.vars=c(3,2), rfrq="111")
#>
#> freq perc p.row
#> area Brent Camden Westminster Brent Camden Westminster Brent
#> driver
#> Butcher 72 1 22 6.0% 0.1% 1.8% 75.8%
#> Carpenter 29 19 221 2.4% 1.6% 18.5% 10.8%
#> Carter 177 47 5 14.8% 3.9% 0.4% 77.3%
#> Farmer 19 87 11 1.6% 7.3% 0.9% 16.2%
#> Hunter 128 4 24 10.7% 0.3% 2.0% 82.1%
#> Miller 6 41 77 0.5% 3.4% 6.4% 4.8%
#> Taylor 42 142 20 3.5% 11.9% 1.7% 20.6%
#>
#> p.col
#> area Camden Westminster Brent Camden Westminster
#> driver
#> Butcher 1.1% 23.2% 15.2% 0.3% 5.8%
#> Carpenter 7.1% 82.2% 6.1% 5.6% 58.2%
#> Carter 20.5% 2.2% 37.4% 13.8% 1.3%
#> Farmer 74.4% 9.4% 4.0% 25.5% 2.9%
#> Hunter 2.6% 15.4% 27.1% 1.2% 6.3%
#> Miller 33.1% 62.1% 1.3% 12.0% 20.3%
#> Taylor 69.6% 9.8% 8.9% 41.6% 5.3%
# putting the areas in rows
PercTable(tab=tab, col.vars=c(3,1), rfrq="100", margins=c(1,2))
#>
#> freq
#> driver Butcher Carpenter Carter Farmer Hunter Miller Taylor
#> area
#> Brent 72 29 177 19 128 6 42
#> Camden 1 19 47 87 4 41 142
#> Westminster 22 221 5 11 24 77 20
#> Sum 95 269 229 117 156 124 204
#>
#> perc
#> driver Sum Butcher Carpenter Carter Farmer Hunter Miller
#> area
#> Brent 473 6.0% 2.4% 14.8% 1.6% 10.7% 0.5%
#> Camden 341 0.1% 1.6% 3.9% 7.3% 0.3% 3.4%
#> Westminster 380 1.8% 18.5% 0.4% 0.9% 2.0% 6.4%
#> Sum 1'194 8.0% 22.5% 19.2% 9.8% 13.1% 10.4%
#>
#>
#> driver Taylor Sum
#> area
#> Brent 3.5% 39.6%
#> Camden 11.9% 28.6%
#> Westminster 1.7% 31.8%
#> Sum 17.1% 100.0%
# formula interface with subset
PercTable(driver ~ area, data=d.pizza, subset=wine_delivered==0)
#>
#> area Brent Camden Westminster
#> driver
#>
#> Butcher freq 65 1 18
#> perc 6.4% 0.1% 1.8%
#>
#> Carpenter freq 27 14 170
#> perc 2.6% 1.4% 16.7%
#>
#> Carter freq 161 42 4
#> perc 15.8% 4.1% 0.4%
#>
#> Farmer freq 19 72 9
#> perc 1.9% 7.1% 0.9%
#>
#> Hunter freq 113 4 22
#> perc 11.1% 0.4% 2.2%
#>
#> Miller freq 6 35 67
#> perc 0.6% 3.4% 6.6%
#>
#> Taylor freq 36 118 18
#> perc 3.5% 11.6% 1.8%
#>
# sort the table by rows, order first column (Zurich), then third, then row.names (0)
PercTable(tab=Sort(tab, ord=c(1,3,0)))
#>
#> area Brent Camden Westminster
#> driver
#>
#> Miller freq 6 41 77
#> perc 0.5% 3.4% 6.4%
#>
#> Farmer freq 19 87 11
#> perc 1.6% 7.3% 0.9%
#>
#> Carpenter freq 29 19 221
#> perc 2.4% 1.6% 18.5%
#>
#> Taylor freq 42 142 20
#> perc 3.5% 11.9% 1.7%
#>
#> Butcher freq 72 1 22
#> perc 6.0% 0.1% 1.8%
#>
#> Hunter freq 128 4 24
#> perc 10.7% 0.3% 2.0%
#>
#> Carter freq 177 47 5
#> perc 14.8% 3.9% 0.4%
#>
# reverse the row variables, so that absolute frequencies and percents
# are not nested together
PercTable(tab, row.vars=c(3, 1))
#>
#> area Brent Camden Westminster
#> driver
#> freq Butcher 72 1 22
#> Carpenter 29 19 221
#> Carter 177 47 5
#> Farmer 19 87 11
#> Hunter 128 4 24
#> Miller 6 41 77
#> Taylor 42 142 20
#>
#> perc Butcher 6.0% 0.1% 1.8%
#> Carpenter 2.4% 1.6% 18.5%
#> Carter 14.8% 3.9% 0.4%
#> Farmer 1.6% 7.3% 0.9%
#> Hunter 10.7% 0.3% 2.0%
#> Miller 0.5% 3.4% 6.4%
#> Taylor 3.5% 11.9% 1.7%
#>
# the vector interface
PercTable(x=d.pizza$driver, y=d.pizza$area)
#>
#> Brent Camden Westminster
#>
#> Butcher freq 72 1 22
#> perc 6.0% 0.1% 1.8%
#>
#> Carpenter freq 29 19 221
#> perc 2.4% 1.6% 18.5%
#>
#> Carter freq 177 47 5
#> perc 14.8% 3.9% 0.4%
#>
#> Farmer freq 19 87 11
#> perc 1.6% 7.3% 0.9%
#>
#> Hunter freq 128 4 24
#> perc 10.7% 0.3% 2.0%
#>
#> Miller freq 6 41 77
#> perc 0.5% 3.4% 6.4%
#>
#> Taylor freq 42 142 20
#> perc 3.5% 11.9% 1.7%
#>
PercTable(x=d.pizza$driver, y=d.pizza$area, margins=c(1,2), rfrq="000", useNA="ifany")
#>
#> Brent Camden Westminster NA Sum
#>
#> Butcher 72 1 22 1 96
#> Carpenter 29 19 221 3 272
#> Carter 177 47 5 5 234
#> Farmer 19 87 11 0 117
#> Hunter 128 4 24 0 156
#> Miller 6 41 77 1 125
#> Taylor 42 142 20 0 204
#> NA 1 3 1 0 5
#> Sum 474 344 381 10 1'209
# one dimensional x falls back to the function Freq()
PercTable(x=d.pizza$driver)
#>
#> freq perc
#>
#> Butcher 96 8.0%
#> Carpenter 272 22.6%
#> Carter 234 19.4%
#> Farmer 117 9.7%
#> Hunter 156 13.0%
#> Miller 125 10.4%
#> Taylor 204 16.9%
# the margin tables
Margins(Titanic)
#> $Class
#> level freq perc cumfreq cumperc
#> 1 1st 325 14.8% 325 14.8%
#> 2 2nd 285 12.9% 610 27.7%
#> 3 3rd 706 32.1% 1'316 59.8%
#> 4 Crew 885 40.2% 2'201 100.0%
#>
#> $Sex
#> level freq perc cumfreq cumperc
#> 1 Male 1'731 78.6% 1'731 78.6%
#> 2 Female 470 21.4% 2'201 100.0%
#>
#> $Age
#> level freq perc cumfreq cumperc
#> 1 Child 109 5.0% 109 5.0%
#> 2 Adult 2'092 95.0% 2'201 100.0%
#>
#> $Survived
#> level freq perc cumfreq cumperc
#> 1 No 1'490 67.7% 1'490 67.7%
#> 2 Yes 711 32.3% 2'201 100.0%
#>