Changelog
Source:NEWS.md
crosstable 0.8.1
Bug fixes and improvements
- fixed
as_flextable(compact=TRUE)
with duplicated labels (#87).
crosstable 0.8.0
CRAN release: 2024-09-30
New features
- Remove percents when N=0 with
crosstable(remove_zero_percent=TRUE)
(#78). - Better header for multi-by flextables
as_flextable(ct, remove_header_keys=TRUE)
(#74). - Control font size with
body_add_normal(font_size)
andcrosstable_options(normal_font_size)
(#65). - Option control on height & width in
body_add_gg2()
(#68).
Bug fixes and improvements
- Add envir argument to functions that call
glue()
(#83). - Better error when
x
isNULL
inbody_add_table_section()
(#82). - Warn if
by
is “” (#77). - Default to quiet warnings if columns are missing (#76).
- Moved the legend above the table in
body_add_table_section()
(#73). - Fixed
get_label()
on named vector columns (#72). - Fixed
crosstable(drop_levels)
(#69, #70, #71). - Flextable autofit now uses the recommended method (#62).
-
transpose()
will work on multi-by crosstables (#60). - Fixed a bug happening when NA is already a level (#59).
- Fixed error where
by
contains “label” (#56). - Fixed
as_flextable(header_show_n)
not working in singleby
(#54). - Fixed some missing options in
crosstable_options()
and added tests (#53).
crosstable 0.7.0 2023-11-12
CRAN release: 2023-11-12
New features
- New officer helper
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)
). - Argument
format_fixed(scientific)
can now beFALSE
to force standard format. Can be set throughoptions(crosstable_scientific_log=FALSE)
(#49). - New argument
format_fixed(epsilon)
to format values as"<epsilon"
. Can be set throughoptions(crosstable_format_epsilon=0.001)
. - Markdown implementation has improved, with support of crossing patterns (#26), newline tokens (#30), and many new tags (#51).
You can now usebody_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.
Bug fixes and improvements
- Reimplement description of columns containing both
NA
(missing values) and “NA” (characters) (#42). - Argument
as_flextable(by_header)
can now be set throughoptions(crosstable_by_header=FALSE)
to remove all headers. - Argument
body_add_crosstable(header_fontsize)
now defaults to1.2*body_fontsize
. - Adds an error message in
as_flextable()
when the crosstable is empty (#41). - Fixes a regression where references were not added anymore.
crosstable 0.6.2 2023-05-26
CRAN release: 2023-05-28
Bug fixes and improvements
- Fixes for CRAN checks.
- Fixes
write_and_open()
not opening sometimes. - Trailing commas will not make
crosstable_options()
fail anymore.
crosstable 0.6.0 2023-03-26
CRAN release: 2023-03-26
New features
New function
transpose_crosstable()
(or simplyt()
), which transposes a crosstable so thatby
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 thatvariable
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 replacesbody_add_crosstable_list()
andbody_add_flextable_list()
. It allows both crosstables and flextable (and even dataframes, which are turned to flextables first) and has a new argumentfun_after
to control what comes after the table. See examples in?body_add_table_list
.New function
get_percent_pattern()
. See also the new vignettevignette("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 namescell
andtotal
, so that the “Total” column can be labelled too.
Breaking changes (minor)
showNA="no"
is now consistent withstats::addmargins()
,gtsummary::tbl_cross(missing="no")
, andjanitor::tabyl(show_na=FALSE)
. It now actually removes allNA
from the equation, instead of not doing much (#24).In
percent_patern
, the proportion relative to the total samplep_cell
has been renamed top_tot
for clarity.
Bug fixes and improvements
- Removed unexpected warning “NaNs produced” thrown when calculating percentages in totals while the number of NA is higher than the other classes (#20).
- The output is now correct when
header_show_n=TRUE
andremove_header_keys=TRUE
while using multiple by variables (#21). - Flextables will not have missing columns when using multiple by variables that has same key levels.
- String interpolation works as intended in
body_add_xxx_legend()
. -
crosstable()
will not fail iffisher.test()
fails [#28] -
forcats::fct_explicit_na()
is not used anymore [#29] -
body_add_normal()
now removes ` symbols when showing code [#31] - Trailing commas will not make
apply_labels()
fail anymore [#32] - Performance improvement (around 30% for small tables) as confidence intervals are not calculated anymore when not needed [#34]
Many thanks to Stephan Daus (@sda030) for his bug reports and feedback on this release.
crosstable 0.5.0 2022-08-16
CRAN release: 2022-08-16
New features
- New
clean_names_with_labels()
which cleans the names of the dataframe but keeps the old names as labels. Obviously inspired by janitor. - New variables
n_col
,n_row
, andn_tot
available forpercent_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 namesbody
,total_row
,total_col
, andtotal_all
to also control the pattern in other parts of the crosstable than the body.
Improvements
-
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 newcrosstable_reset_options()
. -
crosstable_test_args()
andcrosstable_effect_args()
now have arguments to easily control the non-default parameters. - Allow scientific notation for big numbers. Default to numbers for
which abs(log10(x))>4
. This can be controlled using options, e.g.crosstable_options(scientific_log=5)
. - In MS Word, crosstables will now break across pages by default. You can revert this by using
body_add_crosstable(allow_break=FALSE)
or usingcrosstable_options()
. This is the pendant ofkeepnext
in officer/flextable. - New argument
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, otherwiseflextable()
will be applied. - Better error messages in
import_labels()
whendata_label
doesn’t have the right columns.
Deprecations
-
rename_dataframe_with_labels()
is now deprecated in favor of the better namedrename_with_labels()
. -
compact()
is now deprecated in favor ofct_compact()
to avoid the conflict withpurrr::compact()
. It will be removed in the next version.
Bug fixes
-
body_add_crosstable(..., parse=NULL)
will now work as intended . -
by_header
can replace the “value” column ifby
has only one stratum, in bothas_gt()
andas_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 whenby
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. - Minor other bugfixes
crosstable 0.4.0 (2022-02-14)
CRAN release: 2022-02-14
New features
- You can now use basic markdown formats in
body_add_normal()
: **bold**, *italic*, _underlined_, and `code
`. - New
keep_id
argument incompact.crosstable()
, which enablesas_flextable(compact=TRUE, keep_id=TRUE)
- You can use
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}
whenby
has multiple strata. - Functions
body_add_table_legend()
andbody_add_figure_legend()
earn an argumentlegend_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.
Improvements
- You can now set normal style directly in
body_add_normal()
(it was only doable through options before). - Removed the “variable” header in compacted crosstables.
- Dataset
mtcars2
is now a tibble, with its rownames as a column named “model”. -
as_flextable(by_header=FALSE)
now removes the group header (ifby
has only one stratum). -
as_flextable(header_show_n)
now also works ifby
has multiple strata. -
as_flextable(header_show_n=TRUE)
adds group size for all groups.
Bug fixes
- Fixed a bug when numeric variables are treated as categorical (failed if one had a
NA
value). - Fixed a bug that caused
body_add_normal()
to add an extra empty paragraph if there was a reference in the text. - Fixed a bug so that
body_add_normal()
can be used without argument. - Fixed a bug in
effect=TRUE
when some groups were present intable()
but not inglm()
due to missing values.
crosstable 0.3.2 (2021-11-27)
CRAN release: 2021-11-27
New features
- Global options management is now easier thanks to
crosstable_options()
and autocompletion. Almost every argument can now be set using options. See?crosstable_options
for further details. - You can also use
crosstable_peek_options()
to see which crosstable option is currently set. - New argument
num_digits
incrosstable()
. It was about time! - New argument
header_show_n
foras_flextable()
, which adds the group size (N=xx
) to the header of the flextable. - New arguments (and global options)
par_before
andpar_after
in respectivelybody_add_table_legend()
andbody_add_figure_legend()
, which add an empty paragraph before/after the legend (for readability). - New function for {officer}:
body_replace_text_at_bkms()
, to replace several bookmarks at once. - New global option
crosstable_options(crosstable_zero_percent=FALSE)
, which removes percentages whenevern==0
(as it would always be 0%). I should add it as an argument ofcrosstable()
one day…
Improvements
- Better sorting when numeric variables are treated as categorical (before, 10 was sorted before 2).
- Removed the labelled class which caused too many problems for little to no improvement. See https://github.com/larmarange/labelled/issues/111.
Bug fixes
- fixed a bug in
crosstable()
occurring when one offuns
does not have ellipsis (…) andfuns_arg
contains an unused argument.
crosstable 0.3.1 (2021-11-14)
CRAN release: 2021-11-14
New features
- New parameter
percent_pattern
in replacement ofcrosstable(margin=x)
for better control over proportion format. Introduces the possibility of displaying confidence intervals (using Wilson score method) along with proportions. - New function
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. - New argument
crosstable_padding_v
foras_flextable()
to manage vertical padding. Also available as the global optioncrosstable_padding_v
. - New global options
crosstable_{arg}
for almost all arguments. See?crosstable_options
for more details.
Bug fixes
- fixed a bug in
as_flextable()
occurring whenshowNA=TRUE
(header row was disappearing) - fixed a bug occurring very randomly, when rounding caused
format_fixed()
to return a numeric value (“Error: Can’t combine..1$value
and ..2$value
.”) - crosstable now shows all unused levels in
by
when it is a factor - removed extra bold columns in compacted crosstables displayed as flextables
crosstable 0.2.2 (2021-10-18)
CRAN release: 2021-10-19
New features
- Added support for multiple
by
! You can now writecrosstable(mtcars, c(mpg, gear), by=c(am, vs)) %>% as_flextable()
. - Added a macro that can autofit every table in the document at once. This macro can be generated using the function
generate_autofit_macro()
which creates a file that should then be imported into MS Word. -
body_add_crosstable()
gains apadding_v
argument to control the vertical padding of all rows. -
body_add_title()
andbody_add_xxx_legend)
gain a glue functionality. You can now writebody_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. - New parameter
percent
informat_fixed(percent=TRUE/FALSE)
to easily format percentages.
Minor changes
-
style
is deprecated inbody_add_table_legend()
andbody_add_image_legend()
in favor ofname_format
. - Changed the behaviour of some
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. Usesquish=FALSE
to override. -
docx_bookmarks2()
gains atarget
parameter.
Bug fixes
-
effect
calculation now takes into account the reference level (first level of a factor). -
body_add_crosstable()
rightly takesbody_fontsize
andheader_fontsize
into account. - Added few more warnings, so that you know what went wrong.
Internal
- burgled 2 functions using
burglr::burgle()
to avoid dependency:nortest::ad.test()
andDescTools::CochranArmitageTest()
. - fixes the bug from the breaking change in
testthat
(https://github.com/DanChaltiel/crosstable/pull/3).
crosstable 0.2.1 (2021-02-07)
CRAN release: 2021-03-08
- First version on CRAN
- Improved functions naming in
funs
, especially with multiple combinations of named and unnamed functions, including lambda or anonymous - Use
simplify=FALSE
inget_label()
to get a list instead of a vector
crosstable 0.2.0 (2021-02-02)
Misc
- added lots of global options for easier implementation. See
?crosstable_options
for the comprehensive list. - added label helpers:
apply_labels()
(inspired byexpss
’s),copy_label_from()
andrename_dataframe_with_labels()
- added
as_workbook()
to export a crosstable as a formattedopenxlsx
Excel workbook, for copypasting purpose. - added
peek()
to open a crosstable in a temporary Word document, as copy-pasting in RStudio’s viewer is very limited. - fixed the bug when a columns contained both “NA” (string) and
<NA>
(missing). - fixed the bug where function in
funs
was not found if declared in another environment. - numerous other minor bugfixes and internal improvements.
Officer
- added cross-reference functionality to
body_add_figure_legend()
andbody_add_table_legend()
.
Use thebookmark
argument to set a reference, then write"\\@ref(my_bkm)"
insidebody_add_normal()
to call it. - added docx helpers to add lists:
body_add_list()
andbody_add_list_item()
. These will unfortunately not work with the defaultofficer
template. - added some alternatives for some
officer
functions: -
docx_bookmarks2()
, which list bookmarks found in the header and footer as well -
body_add_img2()
, andbody_add_gg2()
, which win aunits=c("in", "cm", "mm")
argument -
write_and_open()
, an alternative toprint()
for documents, which tries to open it right away.
Deprecations
- Ellipsis (
...
) use incrosstable()
has been deprecated for a more “tidy” syntax. Writecrosstable(mtcars2, c(disp, vs))
instead ofcrosstable(mtcars2, disp, vs)
. Ellipsis will be defunct in future v1.0. -
crosstable(.vars=)
has been renamed tocrosstable(cols=)
. -
moystd()
has been renamed tomeansd()
. -
body_add_glued()
has been superseded bybody_add_normal()
, which inherits all functionalities and more.
crosstable 0.1.5 (2020-08-02)
- added minimal support for
gt
tables (withas_gt()
) for those who like them better thanflextable
s - improved working with
officer
: addedbody_add_figure_legend()
andfontsize
options forbody_add_crosstable()
crosstable 0.1.4 (2020-07-16)
- added
save_labels()
to ease working withdplyr
- added
meanCI()
an additional summary function to use incrosstable()
’sfuns
argument - improved support for
Date
variables - multiple, numerous bug fixes
- renamed
moystd()
tomeansd()
crosstable 0.1.3 (2020-06-29)
- Added support for description of
Date
variables. Format can be specified infuns_arg
with thedate_format
key. - Removed some dependencies to ease installation
crosstable 0.1.2 (2020-06-10)
- Effect refactoring: better error/warning handling
- Name sanitation: replacing “.” by “_” in function names
- Better error messages
- Bug fixes
crosstable 0.1.1 (2020-06-07)
New features and behaviors
- Added
format_fixed()
, rounding with the right number of decimals (including zeros) - Added
import_labels()
, which apply labels taken from a source dataframe (name, label) to another dataframe - Added
margin="none"
option, to remove percentages and keep only counts - Columns of unsupported class are dropped with a warning instead of failing with an error
Misc
- Method
cross_to_flextable()
(ctf()
) was deprecated and renamedas_flextable()
(#207) - Reexporting pipes and tidyselect helpers so that user does not have to load these libraries
- Computing time optimization (speed x2.6!)
- Fixed bug in normality testing
- Fixed bug in
compact()
crosstable 0.1.0 (2020-04-09)
- First release, big changes from the
biostat2
package.