Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/moj-analytical-services/xltabr
xltabr: An R package for writing formatted cross tabulations (contingency tables) to Excel using openxlsx
https://github.com/moj-analytical-services/xltabr
contingency-table cran cross-tabulation excel excel-export excelwriter formatter package pivot-tables r
Last synced: 3 months ago
JSON representation
xltabr: An R package for writing formatted cross tabulations (contingency tables) to Excel using openxlsx
- Host: GitHub
- URL: https://github.com/moj-analytical-services/xltabr
- Owner: moj-analytical-services
- Archived: true
- Created: 2017-06-17T12:54:44.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2017-11-28T10:40:11.000Z (almost 7 years ago)
- Last Synced: 2024-05-21T02:53:44.232Z (6 months ago)
- Topics: contingency-table, cran, cross-tabulation, excel, excel-export, excelwriter, formatter, package, pivot-tables, r
- Language: R
- Homepage: https://moj-analytical-services.github.io/xltabr/
- Size: 3.14 MB
- Stars: 32
- Watchers: 43
- Forks: 6
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- jimsghstars - moj-analytical-services/xltabr - xltabr: An R package for writing formatted cross tabulations (contingency tables) to Excel using openxlsx (R)
README
[![Coverage Status](https://img.shields.io/codecov/c/github/moj-analytical-services/xltabr/master.svg)](https://codecov.io/github/moj-analytical-services/xltabr?branch=master) [![Build Status](https://travis-ci.org/moj-analytical-services/xltabr.svg?branch=dev)](https://travis-ci.org/moj-analytical-services/xltabr) [![Cran Status](http://www.r-pkg.org/badges/version/xltabr)](https://cran.r-project.org/web/packages/xltabr/index.html) [![Cran Downloads](https://cranlogs.r-pkg.org/badges/xltabr)](https://www.r-pkg.org/pkg/xltabr)
**Warning: `xltabr` is in early development. Please raise an [issue](https://github.com/moj-analytical-services/xltabr/issues) if you find any bugs**
Introduction
------------`xltabr` allows you to write formatted cross tabulations to Excel using [`openxlsx`](https://github.com/awalker89/openxlsx). It has been developed to help automate the process of publishing Official Statistics.
The package works best when the input dataframe is the output of a crosstabulation performed by `reshape2:dcast`. This allows the package to autorecognise various elements of the cross tabulation, which can be styled accordingly.
For example, given a crosstabulation `ct` produced by `reshape2`, the following code produces the table shown.
``` r
titles = c("Breakdown of car statistics", "Cross tabulation of drive and age against type*")
footers = "*age as of January 2015"
wb <- xltabr::auto_crosstab_to_wb(ct, titles = titles, footers = footers)
openxlsx::openXL(wb)
```![image](vignettes/example_1.png?raw=true)
This readme provides a variety of examples of increasing complexity. It is based on a simulated dataset built into the package, which you can see [here](https://github.com/moj-analytical-services/xltabr/blob/master/inst/extdata/synthetic_data.csv).
Getting started
---------------Much of `xltabr` utility comes from its ability to automatically format cross tabulations which have been produced by `reshape2:dcast`.
The package provides a core convenience function called `xltabr::auto_crosstab_to_xl`. This wraps more advanced functionality, at the cost of reducing flexibility.
The following code assumes you've read in the synthetic data as follows:
``` r
# Read in data
path <- system.file("extdata", "synthetic_data.csv", package="xltabr")
df <- read.csv(path, stringsAsFactors = FALSE)
```### Example 1: Simple cross tabulation to Excel
``` r
# Create a cross tabulation using reshape2
ct <- reshape2::dcast(df, drive + age ~ type, value.var= "value", margins=c("drive", "age"), fun.aggregate = sum)
ct <- dplyr::arrange(ct, -row_number())# Use the main convenience function from xltabr to output to excel
tab <- xltabr::auto_crosstab_to_wb(ct, return_tab = TRUE) #wb is an openxlsx workbook object
openxlsx::openXL(tab$wb)
```![image](vignettes/example_2.png?raw=true)
### Example 2: Standard data frame to Excel
There is also a convenience function to write a standard data.frame to Excel:
``` r
wb <- xltabr::auto_df_to_wb(mtcars)
openxlsx::openXL(wb)
```![image](vignettes/example_3.png?raw=true)
### Example 3: Add in titles and footers
``` r
titles = c("Breakdown of car statistics", "Cross tabulation of drive and age against type*")
footers = "*age as of January 2015"
wb <- xltabr::auto_crosstab_to_wb(ct, titles = titles, footers = footers)
openxlsx::openXL(wb)
```![image](vignettes/example_1.png?raw=true)
### Example 4: Supply custom styles
``` r
path <- system.file("extdata", "styles_pub.xlsx", package = "xltabr")
cell_path <- system.file("extdata", "style_to_excel_number_format_alt.csv", package = "xltabr")
xltabr::set_style_path(path)
xltabr::set_cell_format_path(cell_path)
wb <- xltabr::auto_crosstab_to_wb(ct)
openxlsx::openXL(wb)
```![image](vignettes/example_5.png?raw=true)
### Example 5: Output more than one table
``` r
# Change back to default styles
xltabr::set_style_path()
xltabr::set_cell_format_path()# Create second crosstab
ct2 <- reshape2::dcast(df, drive + age ~ colour, value.var= "value", margins=c("drive", "age"), fun.aggregate = sum)
ct2 <- dplyr::arrange(ct2, -row_number())tab <- xltabr::auto_crosstab_to_wb(ct, titles = titles, footers = c(footers, ""), return_tab = TRUE)
titles2 = c("Table 2: More car statistics", "Cross tabulation of drive and age against colour*")
footers2 = "*age as of January 2015"
wb <- xltabr::auto_crosstab_to_wb(ct2, titles = titles2, footers = footers2, insert_below_tab = tab)
openxlsx::openXL(wb)
```![image](vignettes/example_4.png?raw=true)
### Example 6: Output more than one table, with different styles
``` r
tab <- xltabr::auto_crosstab_to_wb(ct, titles = titles, footers = c(footers, ""), return_tab = TRUE)xltabr::set_style_path(path)
xltabr::set_cell_format_path(cell_path)wb <- xltabr::auto_crosstab_to_wb(ct2, titles = titles2, footers = footers2, insert_below_tab = tab)
openxlsx::openXL(wb)# Change back to default styles
xltabr::set_style_path()
xltabr::set_cell_format_path()
```![image](vignettes/example_6.png?raw=true)
### Example 7: Auoindent off
``` r
ct <- reshape2::dcast(df, drive + age ~ type, value.var= "value", fun.aggregate = sum)
wb <- xltabr::auto_crosstab_to_wb(ct, titles = titles, footers = c(footers, ""), indent = FALSE, left_header_colnames = c("drive", "age"))
openxlsx::openXL(wb)
```![image](vignettes/example_7.png?raw=true)
### auto\_crosstab\_to\_wb options
The following provides a list of all the options you can provide to `auto_crosstab_to_wb`
## Take a cross tabulation produced by 'reshape2::dcast' and output a formatted openxlsx wb object
##
## Description:
##
## Take a cross tabulation produced by 'reshape2::dcast' and output a formatted openxlsx wb object
##
## Usage:
##
## auto_crosstab_to_wb(df, auto_number_format = TRUE, top_headers = NULL,
## titles = NULL, footers = NULL, auto_open = FALSE, indent = TRUE,
## left_header_colnames = NULL, vertical_border = TRUE, return_tab = FALSE,
## auto_merge = TRUE, insert_below_tab = NULL, total_text = NULL,
## include_header_rows = TRUE, wb = NULL, ws_name = NULL,
## number_format_overrides = list(), fill_non_values_with = list(na = NULL,
## nan = NULL, inf = NULL, neg_inf = NULL), allcount_to_level_translate = NULL,
## left_header_col_widths = NULL, body_header_col_widths = NULL)
##
## Arguments:
##
## df: A data.frame. The cross tabulation to convert to Excel
##
## auto_number_format: Whether to automatically detect number format
##
## top_headers: A list. Custom top headers. See 'add_top_headers()'
##
## titles: The title. A character vector. One element per row of title
##
## footers: Table footers. A character vector. One element per row of footer.
##
## auto_open: Boolean. Automatically open Excel output.
##
## indent: Automatically detect level of indentation of each row
##
## left_header_colnames: The names of the columns that you want to designate as left headers
##
## vertical_border: Boolean. Do you want a left border?
##
## return_tab: Boolean. Return a tab object rather than a openxlsx workbook object
##
## auto_merge: Boolean. Whether to merge cells in the title and footers to width of body
##
## insert_below_tab: A existing tab object. If provided, this table will be written on the same sheet, below the provided tab.
##
## total_text: The text that is used for the 'grand total' of a cross tabulation
##
## include_header_rows: Boolean - whether to include or omit the header rows
##
## wb: A existing openxlsx workbook. If not provided, a new one will be created
##
## ws_name: The name of the worksheet you want to write to
##
## number_format_overrides: e.g. list("colname1" = "currency1") see auto_style_number_formatting
##
## fill_non_values_with: Manually specify a list of strings that will replace non numbers types NA, NaN, Inf and -Inf. e.g. list(na = '*', nan = '', inf = '-', neg_inf = '-'). Note: NaNs are not treated as NAs.
##
## allcount_to_level_translate: Manually specify how to translate summary levels into header formatting
##
## left_header_col_widths: Width of row header columns you wish to set in Excel column width units. If singular, value is applied to all row header columns. If a vector, vector must have length equal to the number of row headers in workbook. Use special case "auto" for
## automatic sizing. Default (NULL) leaves column widths unchanged.
##
## body_header_col_widths: Width of body header columns you wish to set in Excel column width units. If singular, value is applied to all body columns. If a vector, vector must have length equal to the number of body headers in workbook. Use special case "auto" for
## automatic sizing. Default (NULL) leaves column widths unchanged.
##
## Examples:
##
## crosstab <- read.csv(system.file("extdata", "example_crosstab.csv", package="xltabr"))
## wb <- auto_crosstab_to_wb(crosstab)
##Advanced usage
--------------The simple examples above wrap lower-level functions. These functions can be used to customise the output in a number of ways.
The following example shows the range of functions available.
``` r
tab <- xltabr::initialise() %>% #Options here for providing an existing workbook, changing worksheet name, and position of table in wb
xltabr::add_title(title_text) %>% # Optional title_style_names allows user to specify formatting
xltabr::add_top_headers(h_list) %>% # Optional row_style_names and col_style_names allows custom formatting
xltabr::add_body(df) %>% #Optional left_header_colnames, row_style_names, left_header_style_names col_style names
xltabr::add_footer(footer_text) %>% # Optional footer_style_names
xltabr::auto_detect_left_headers() %>% # Auto detect left headers through presence of keyword, default = '(all)'
xltabr::auto_detect_body_title_level() %>% # Auto detect level of emphasis of each row in body, through presence of keyword
xltabr::auto_style_indent() %>% # Consolidate all left headers into a single column, with indentation to signify emphasis level
xltabr::auto_merge_title_cells() %>% # merge the cells in the title
xltabr::auto_merge_footer_cells() # merge the cells in the footer
```The convenience functions contain further examples of how to build up a tab. See [here](https://github.com/moj-analytical-services/xltabr/blob/dev/R/convenience.R).
Implementation diagrams.
------------------------See [here](https://www.draw.io/?lightbox=1&highlight=0000ff&edit=_blank&layers=1&nav=1&title=xltabr#Uhttps%3A%2F%2Fdrive.google.com%2Fa%2Fdigital.justice.gov.uk%2Fuc%3Fid%3D0BwYwuy7YhhdxY2hGQnVGNFN6QkE%26export%3Ddownload)