crosstable 0.8.3
New features
- New function
body_add_flextable2(): automatically adds a legend if theflextableobject has a"legend"attribute. Equivalent functionality is now available inbody_add_gg2(). (#100) - New argument
rename_with_labels(cols), more intuitive thanexcept. (#99)
Bug fixes and improvements
- Fixed bug in
rename_with_labels()whenexceptcontainsc().(#99) - Fixed bug in
crosstable()when a factor variable hadNAas a level (like afterforcats::fct_value_to_na_level()). (#94)
crosstable 0.8.2
CRAN release: 2025-09-07
New features
- New argument
apply_labels(fn)to modify existing labels (#80).
Bug fixes and improvements
- fixed
crosstable_options()sometimes not being taken into account (#90). - fixed error when using a named list of functions in
crosstable(funs)(#89). - fixed rare infinite loop with
get_label()on very specific objects likePOSIXlt(#86).
crosstable 0.8.1
CRAN release: 2024-11-01
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
xisNULLinbody_add_table_section()(#82). - Warn if
byis “” (#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
bycontains “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 beFALSEto 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_normalfor 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 thatbyis 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 thatvariableis 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_afterto 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 namescellandtotal, 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 allNAfrom the equation, instead of not doing much (#24).In
percent_patern, the proportion relative to the total samplep_cellhas been renamed top_totfor 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=TRUEandremove_header_keys=TRUEwhile 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_totavailable forpercent_pattern. Also, every variable has now its counterpart with the_nasuffix 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_patterncan now be a list of characters with namesbody,total_row,total_col, andtotal_allto 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 ofkeepnextin 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_labeldoesn’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_headercan replace the “value” column ifbyhas only one stratum, in bothas_gt()andas_flextable()(https://github.com/DanChaltiel/crosstable/issues/9). -
percent_patterncan now contain functions that start by “p” (https://github.com/DanChaltiel/crosstable/issues/10). -
percent_patternis actually taken into account whenbyhas 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_idargument 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}whenbyhas 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
mtcars2is now a tibble, with its rownames as a column named “model”. -
as_flextable(by_header=FALSE)now removes the group header (ifbyhas only one stratum). -
as_flextable(header_show_n)now also works ifbyhas 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
NAvalue). - 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=TRUEwhen 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_optionsfor further details. - You can also use
crosstable_peek_options()to see which crosstable option is currently set. - New argument
num_digitsincrosstable(). It was about time! - New argument
header_show_nforas_flextable(), which adds the group size (N=xx) to the header of the flextable. - New arguments (and global options)
par_beforeandpar_afterin 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 offunsdoes not have ellipsis (…) andfuns_argcontains an unused argument.
crosstable 0.3.1 (2021-11-14)
CRAN release: 2021-11-14
New features
- New parameter
percent_patternin 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_vforas_flextable()to manage vertical padding. Also available as the global optioncrosstable_padding_v. - New global options
crosstable_{arg}for almost all arguments. See?crosstable_optionsfor 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$valueand ..2$value.”) - crosstable now shows all unused levels in
bywhen 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_vargument 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
percentinformat_fixed(percent=TRUE/FALSE)to easily format percentages.
Minor changes
-
styleis deprecated inbody_add_table_legend()andbody_add_image_legend()in favor ofname_format. - Changed the behaviour of some
effectcalculations 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=FALSEto override. -
docx_bookmarks2()gains atargetparameter.
Bug fixes
-
effectcalculation now takes into account the reference level (first level of a factor). -
body_add_crosstable()rightly takesbody_fontsizeandheader_fontsizeinto 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=FALSEinget_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_optionsfor 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 formattedopenxlsxExcel 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
funswas 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 thebookmarkargument 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 defaultofficertemplate. - added some alternatives for some
officerfunctions: -
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
gttables (withas_gt()) for those who like them better thanflextables - improved working with
officer: addedbody_add_figure_legend()andfontsizeoptions 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()’sfunsargument - improved support for
Datevariables - multiple, numerous bug fixes
- renamed
moystd()tomeansd()
crosstable 0.1.3 (2020-06-29)
- Added support for description of
Datevariables. Format can be specified infuns_argwith thedate_formatkey. - 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
biostat2package.
