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