Learn R Programming

flextable (version 0.7.2)

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,
  datasup_first = NULL,
  datasup_last = NULL,
  hidden_data = NULL,
  row_compose = list(),
  ...
)

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

Value

an object of class tabulator.

Arguments

x

an aggregated data.frame

rows

column names to use in rows dimensions

columns

column names to use in columns dimensions

datasup_first

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

datasup_last

additional data that will be merged with table and placed at the end of the table.

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().

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(), tabulator_colnames()

Examples

Run this code
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