Learn R Programming

flextable (version 0.7.0)

tabulator: Tabulation of aggregations

Description

It tabulates a data.frame representing an aggregation which is then transformed as a flextable. The function allows to define any display with the syntax of flextable in a table whose layout is showing dimensions of the aggregation across rows and columns.

Usage

tabulator(
  x,
  rows,
  columns,
  supp_data = NULL,
  hidden_data = NULL,
  row_compose = list(),
  ...
)

# S3 method for tabulator summary(object, ...)

Arguments

x

an aggregated data.frame

rows

column names to use in rows dimensions

columns

column names to use in columns dimensions

supp_data

additional data that will be merged with table and presented after the columns presenting the row dimensions.

hidden_data

additional data that will be merged with table, the columns are not presented but can be used with compose() or mk_par() function.

row_compose

a list of call to as_paragraph() - these calls will be applied to the row dimensions (the name is used to target the displayed column).

...

named arguments calling function as_paragraph(). The names are used as labels and the values are evaluated when the flextable is created.

object

an object returned by function tabulator().

Value

an object of class tabulator.

Methods (by generic)

  • summary: call summary() to get a data.frame describing mappings between variables and their names in the flextable. This data.frame contains a column named col_keys where are stored the names that can be used for further selections.

Illustrations

ft_1 appears as:

ft_2 appears as:

See Also

as_flextable.tabulator(), summarizor(), as_grouped_data()

Examples

Run this code
# NOT RUN {
n_format <- function(z){
  x <- sprintf("%.0f", z)
  x[is.na(z)] <- "-"
  x
}

set_flextable_defaults(digits = 2, border.color = "gray")

if(require("stats")){
  dat <- aggregate(breaks ~ wool + tension,
    data = warpbreaks, mean)

  cft_1 <- tabulator(
    x = dat, rows = "wool",
    columns = "tension",
    `mean` = as_paragraph(as_chunk(breaks)),
    `(N)` = as_paragraph(
      as_chunk(length(breaks), formatter = n_format ))
  )

  ft_1 <- as_flextable(cft_1)
  ft_1
}

if(require("data.table") && require("ggplot2")){

  multi_fun <- function(x) {
    list(mean = mean(x),
         sd = sd(x))
  }
  myformat <- function(z){
    x <- sprintf("%.1f", z)
    x[is.na(z)] <- ""
    x
  }

  grey_txt <- fp_text_default(color = "gray")

  dat <- as.data.table(ggplot2::diamonds)
  dat <- dat[cut %in% c("Fair", "Good", "Very Good")]
  dat <- dat[clarity %in% c("I1", "SI1", "VS2")]

  dat <- dat[, unlist(lapply(.SD, multi_fun),
                      recursive = FALSE),
             .SDcols = c("z", "y"),
             by = c("cut", "color", "clarity")]

  tab_2 <- tabulator(
    x = dat, rows = c("cut", "color"),
    columns = "clarity",
    `z stats` = as_paragraph(
      as_chunk(z.mean, formatter = myformat)),
    `y stats` = as_paragraph(
      as_chunk(y.mean, formatter = myformat),
      as_chunk(" (\u00B1 ", props = grey_txt),
      as_chunk(y.sd, formatter = myformat, props = grey_txt),
      as_chunk(")", props = grey_txt)
      )
  )
  ft_2 <- as_flextable(tab_2)
  ft_2 <- autofit(x = ft_2, add_w = .05)
  ft_2
}

if(require("data.table")){
#' # data.table version
dat <- melt(as.data.table(iris),
            id.vars = "Species",
            variable.name = "name",value.name = "value")[,
              list(avg = mean(value, na.rm = TRUE),
                   sd = sd(value, na.rm = TRUE)),
              by = c("Species", "name")
            ]
# dplyr version
# library(dplyr)
# dat <- iris %>%
#   pivot_longer(cols = -c(Species)) %>%
#   group_by(Species, name) %>%
#   summarise(avg = mean(value, na.rm = TRUE),
#   sd = sd(value, na.rm = TRUE),
#   .groups = "drop")

tab_3 <- tabulator(
  x = dat, rows = c("Species"),
  columns = "name",
  `mean (sd)` = as_paragraph( as_chunk(avg),
     " (", as_chunk(sd),  ")")
  )
ft_3 <- as_flextable(tab_3, separate_with = character(0))
ft_3
}

init_flextable_defaults()
# }

Run the code above in your browser using DataLab