Crosstables for descriptive analyses. See documentation at https://danchaltiel.github.io/crosstable/ and browse code at https://github.com/DanChaltiel/crosstable.
- fixed
as_flextable(compact=TRUE)
with duplicated labels (#87).
- 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).
- 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).
- 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.
- 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.
- Fixes for CRAN checks.
- Fixes
write_and_open()
not opening sometimes. - Trailing commas will not make
crosstable_options()
fail anymore.
Fixes for CRAN checks.
-
New function
transpose_crosstable()
(or simplyt()
), which transposes a crosstable so thatby
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 thatvariable
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 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.
-
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.
- 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.
- 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.
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.
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.
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()
(#9).percent_pattern
can now contain functions that start by "p" (#10).percent_pattern
is actually taken into account whenby
has one single level (#13).import_labels()
now works even if there is a missing value in the dataframe.- Minor other bugfixes
- Maintenance release to fix CRAN errors.
- 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.
- 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.
- 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.
- 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...
- 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 larmarange/labelled#111.
- fixed a bug in
crosstable()
occurring when one offuns
does not have ellipsis (...) andfuns_arg
contains an unused argument.
- 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.
- 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
- renamed branch
master
tomain
- use a lot more snapshots in tests
- 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.
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.
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.
- burgled 2 functions using
burglr::burgle()
to avoid dependency:nortest::ad.test()
andDescTools::CochranArmitageTest()
. - fixes the bug from the breaking change in
testthat
(#3).
- 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
- 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.
- 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 wellbody_add_img2()
, andbody_add_gg2()
, which win aunits=c("in", "cm", "mm")
argumentwrite_and_open()
, an alternative toprint()
for documents, which tries to open it right away.
- 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.
- 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()
- 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()
- Added support for description of
Date
variables. Format can be specified infuns_arg
with thedate_format
key. - Removed some dependencies to ease installation
- Effect refactoring: better error/warning handling
- Name sanitation: replacing "." by "_" in function names
- Better error messages
- Bug fixes
- 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
- 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()
- First release, big changes from the
biostat2
package.