Crosstables for descriptive analyses. See documentation at https://danchaltiel.github.io/crosstable/ and browse code at https://github.com/DanChaltiel/crosstable.
apply_labels(fn) to modify existing labels
(#80).crosstable_options() sometimes not being taken
into account (#90).crosstable(funs) (#89).get_label() on very
specific objects like POSIXlt (#86).as_flextable(compact=TRUE) with duplicated labels
(#87).crosstable(remove_zero_percent=TRUE) (#78).as_flextable(ct, remove_header_keys=TRUE) (#74).body_add_normal(font_size) and
crosstable_options(normal_font_size) (#65).body_add_gg2()
(#68).glue()
(#83).x is NULL in
body_add_table_section() (#82).by is “” (#77).body_add_table_section() (#73).get_label() on named vector columns (#72).crosstable(drop_levels) (#69, #70, #71).transpose() will work on multi-by crosstables
(#60).by contains “label” (#56).as_flextable(header_show_n) not working in single
by (#54).crosstable_options() and
added tests (#53).body_add_table_section() that adds a
table (crosstable or flextable) which can be surrounded by a title
(level 3 by default), a legend, and/or a short sentence.set_label() now accepts a function as a value
(e.g. set_label(mtcars2, toupper)).format_fixed(scientific) can now be
FALSE to force standard format. Can be set through
options(crosstable_scientific_log=FALSE) (#49).format_fixed(epsilon) to format values as
"<epsilon". Can be set through
options(crosstable_format_epsilon=0.001).body_add_normal("Here is **`some code` in bold & *italic* ** <br> And here is <color:red>red text</color>.")?body_add_normal for more insight.NA
(missing values) and “NA” (characters) (#42).as_flextable(by_header) can now be set through
options(crosstable_by_header=FALSE) to remove all
headers.body_add_crosstable(header_fontsize) now
defaults to 1.2*body_fontsize.as_flextable() when the
crosstable is empty (#41).write_and_open() not opening sometimes.crosstable_options() fail
anymore.Fixes for CRAN checks.
New function transpose_crosstable() (or simply
t()), which transposes a crosstable so that by
is in rows instead of columns.
r ct = crosstable(mtcars2, c(mpg, drat), by=am) t_ct = t(ct) as_flextable(t_ct, by_header="Variables")
New function pivot_crosstable(), which pivots a
crosstable so that variable is spread as several
columns.
r ct = crosstable(mtcars2, c(mpg, drat)) p_ct = pivot_crosstable(ct) as_flextable(p_ct)
body_add_table_list() now replaces
body_add_crosstable_list() and
body_add_flextable_list(). It allows both crosstables and
flextable (and even dataframes, which are turned to flextables first)
and has a new argument fun_after to control what comes
after the table. See examples in
?body_add_table_list.
New function get_percent_pattern(). See also the new
vignette vignette("percent_pattern").
New argument crosstable(drop_levels=TRUE) to drop
unused levels in factors.
copy_label_from() now works on dataframes as
well.
as_flextable(header_show_n_pattern) can now be a
list of names cell and total, so that the
“Total” column can be labelled too.
showNA="no" is now consistent with
stats::addmargins(),
gtsummary::tbl_cross(missing="no"), and
janitor::tabyl(show_na=FALSE). It now actually removes all
NA from the equation, instead of not doing much
(#24).
In percent_patern, the proportion relative to the
total sample p_cell has been renamed to p_tot
for clarity.
header_show_n=TRUE and
remove_header_keys=TRUE while using multiple by variables
(#21).body_add_xxx_legend().crosstable() will not fail if
fisher.test() fails [#28]forcats::fct_explicit_na() is not used anymore
[#29]body_add_normal() now removes ` symbols when showing
code [#31]apply_labels() fail
anymore [#32]Many thanks to Stephan Daus (@sda030) for his bug reports and feedback on this release.
clean_names_with_labels() which cleans the names of
the dataframe but keeps the old names as labels. Obviously inspired by
{janitor}.n_col, n_row, and
n_tot available for percent_pattern. Also,
every variable has now its counterpart with the _na suffix
which accounts for missing values. crosstable(mtcars2, cyl, percent_pattern="{p_col} ({n}/{n_col}) [95%CI: {p_col_inf}; {p_col_sup}]")
crosstable(mtcars2, cyl, percent_pattern="{p_col_na} ({n}/{n_col_na}) [95%CI: {p_col_inf}; {p_col_sup}]")percent_pattern can now be a list of characters with
names body, total_row, total_col,
and total_all to also control the pattern in other parts of
the crosstable than the body.crosstable_options() does not need the “crosstable_”
prefix anymore, so the autocomplete is less clumsy. Options with the
prefix will still work though.
crosstable_options(reset=TRUE) is deprecated in favor of
the new crosstable_reset_options().crosstable_test_args() and
crosstable_effect_args() now have arguments to easily
control the non-default parameters.which abs(log10(x))>4. This can be controlled using
options, e.g. crosstable_options(scientific_log=5).body_add_crosstable(allow_break=FALSE) or using
crosstable_options(). This is the pendant of
keepnext in officer/flextable.body_add_crosstable(max_cols=25), which
limits the size of crosstables in Word documents. This prevents very
large tables to be wrongly included.peek() is now usable on non-crosstable objects as well.
as_flextable() method will be applied on the object if
available, otherwise flextable() will be applied.import_labels() when
data_label doesn’t have the right columns.rename_dataframe_with_labels() is now deprecated in
favor of the better named rename_with_labels().compact() is now deprecated in favor of
ct_compact() to avoid the conflict with
purrr::compact(). It will be removed in the next
version.body_add_crosstable(..., parse=NULL) will now work as
intended .by_header can replace the “value” column if
by has only one stratum, in both as_gt() and
as_flextable() (https://github.com/DanChaltiel/crosstable/issues/9).percent_pattern can now contain functions that start by
“p” (https://github.com/DanChaltiel/crosstable/issues/10).percent_pattern is actually taken into account when
by has one single level (https://github.com/DanChaltiel/crosstable/issues/13).import_labels() now works even if there is a missing
value in the dataframe.body_add_normal(): **bold**,
*italic*, _underlined_, and `code`.keep_id argument in
compact.crosstable(), which enables
as_flextable(compact=TRUE, keep_id=TRUE)as_flextable(header_show_n_pattern) to
change the glue pattern of these group sizes. The default is
{.col} (N={.n}); you can use {.col_key} and
{.col_val} when by has multiple strata.body_add_table_legend() and
body_add_figure_legend() earn an argument
legend_prefix. Useful when set through global options, for
instance to make every table/figure start with the name of the
study.crosstable_options() can handle new options for all
those new features.body_add_normal() (it was only doable through options
before).mtcars2 is now a tibble, with its rownames as a
column named “model”.as_flextable(by_header=FALSE) now removes the group
header (if by has only one stratum).as_flextable(header_show_n) now also works if
by has multiple strata.as_flextable(header_show_n=TRUE) adds group size for
all groups.NA value).body_add_normal() to add an
extra empty paragraph if there was a reference in the text.body_add_normal() can be used
without argument.effect=TRUE when some groups were
present in table() but not in glm() due to
missing values.crosstable_options() and autocompletion. Almost every
argument can now be set using options. See
?crosstable_options for further details.crosstable_peek_options() to see which
crosstable option is currently set.num_digits in crosstable().
It was about time!header_show_n for
as_flextable(), which adds the group size
(N=xx) to the header of the flextable.par_before and
par_after in respectively
body_add_table_legend() and
body_add_figure_legend(), which add an empty paragraph
before/after the legend (for readability).body_replace_text_at_bkms(), to replace several bookmarks
at once.crosstable_options(crosstable_zero_percent=FALSE), which
removes percentages whenever n==0 (as it would always be
0%). I should add it as an argument of crosstable() one
day…crosstable() occurring when one of
funs does not have ellipsis (…) and funs_arg
contains an unused argument.percent_pattern in replacement of
crosstable(margin=x) for better control over proportion
format. Introduces the possibility of displaying confidence intervals
(using Wilson score method) along with proportions.body_add_crosstable_list() to add a list
of crosstables all at once, separated by some customizable titles. Also
works with flextables and plain old dataframes.crosstable_padding_v for
as_flextable() to manage vertical padding. Also available
as the global option crosstable_padding_v.crosstable_{arg} for almost all
arguments. See ?crosstable_options for more details.as_flextable() occurring when
showNA=TRUE (header row was disappearing)format_fixed() to return a numeric value (“Error: Can’t
combine ..1$value ..2$value
by when it is
a factormaster to mainby! You can now write
crosstable(mtcars, c(mpg, gear), by=c(am, vs)) %>% as_flextable().generate_autofit_macro() which creates a file that should
then be imported into MS Word.body_add_crosstable() gains a padding_v
argument to control the vertical padding of all rows.body_add_title() and body_add_xxx_legend)
gain a glue functionality. You can now write
body_add_title("The iris dataset (nrow={nrow(iris)})", 1).as_workbook() can now take a named list of crosstables,
that will be considered as sheets.percent in
format_fixed(percent=TRUE/FALSE) to easily format
percentages.style is deprecated in
body_add_table_legend() and
body_add_image_legend() in favor of
name_format.effect calculations that
were done by column instead of rows. That might change some outputs but
not their meaning.body_add_normal() now removes duplicated spaces
(squish) in its input by default. Use squish=FALSE to
override.docx_bookmarks2() gains a target
parameter.effect calculation now takes into account the reference
level (first level of a factor).body_add_crosstable() rightly takes
body_fontsize and header_fontsize into
account.burglr::burgle() to avoid
dependency: nortest::ad.test() and
DescTools::CochranArmitageTest().testthat (https://github.com/DanChaltiel/crosstable/pull/3).funs, especially with
multiple combinations of named and unnamed functions, including lambda
or anonymoussimplify=FALSE in get_label() to get a
list instead of a vector?crosstable_options for the comprehensive list.apply_labels() (inspired by
expss’s), copy_label_from() and
rename_dataframe_with_labels()as_workbook() to export a crosstable as a
formatted openxlsx Excel workbook, for copypasting
purpose.peek() to open a crosstable in a temporary Word
document, as copy-pasting in RStudio’s viewer is very limited.<NA> (missing).funs was not found if
declared in another environment.body_add_figure_legend() and
body_add_table_legend().bookmark argument to set a reference, then write
"\\@ref(my_bkm)" inside body_add_normal() to
call it.body_add_list() and
body_add_list_item(). These will unfortunately not work
with the default officer template.officer
functions:docx_bookmarks2(), which list bookmarks found in the
header and footer as wellbody_add_img2(), and body_add_gg2(), which
win a units=c("in", "cm", "mm") argumentwrite_and_open(), an alternative to
print() for documents, which tries to open it right
away....) use in crosstable() has
been deprecated for a more “tidy” syntax. Write
crosstable(mtcars2, c(disp, vs)) instead of
crosstable(mtcars2, disp, vs). Ellipsis will be defunct in
future v1.0.crosstable(.vars=) has been renamed to
crosstable(cols=).moystd() has been renamed to
meansd().body_add_glued() has been superseded by
body_add_normal(), which inherits all functionalities and
more.gt tables (with
as_gt()) for those who like them better than
flextablesofficer: added
body_add_figure_legend() and fontsize options
for body_add_crosstable()save_labels() to ease working with
dplyrmeanCI() an additional summary function to use in
crosstable()’s funs argumentDate variablesmoystd() to meansd()Date variables. Format
can be specified in funs_arg with the
date_format key.format_fixed(), rounding with the right number of
decimals (including zeros)import_labels(), which apply labels taken from a
source dataframe (name, label) to another dataframemargin="none" option, to remove percentages and
keep only countscross_to_flextable() (ctf()) was
deprecated and renamed as_flextable() (#207)compact()biostat2
package.