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