Crosstables for descriptive analyses. See documentation at https://danchaltiel.github.io/crosstable/ and browse code at https://github.com/DanChaltiel/crosstable.
body_add_table_section()
, which 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>.")
\
See ?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.\
For instance, one can now write: 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
and ..2$value
.")by
when it is a factormaster
to main
by
! 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()
.\
Use the 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 flextable
sofficer
: added body_add_figure_legend()
and fontsize
options for body_add_crosstable()
save_labels()
to ease working with dplyr
meanCI()
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.Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.