Powerful 'SAS' Inspired Concepts for more Efficient Bigger Outputs
Overview
The main goal is to make descriptive evaluations easier to create bigger and more complex outputs in less time with less code. Introducing format containers with multilabels https://documentation.sas.com/doc/en/pgmsascdc/v_067/proc/p06ciqes4eaqo6n0zyqtz9p21nfb.htm, a more powerful summarise which is capable to output every possible combination of the provided grouping variables in one go https://documentation.sas.com/doc/en/pgmsascdc/v_067/proc/p0jvbbqkt0gs2cn1lo4zndbqs1pe.htm, tabulation functions which can create any table in different styles https://documentation.sas.com/doc/en/pgmsascdc/v_067/proc/n1ql5xnu0k3kdtn11gwa5hc7u435.htm and other more readable functions. The code is optimized to work fast even with datasets of over a million observations.
New functionality
macro(): If a non character variable is passed it is now converted to character instead of aborting and throwing an error. (21.09.2026)transpose_plus(): In a wide to long transposition thevaluesparameter can now take in a named list which carries custom variable expressions for the generated id variable. (21.09.2026)multi_join(): When joining multiple data frames on different variable names it is now possible to pass in a list of vectors for the firstonlist entry to enable joining each data frame on the first one on different variable names. (21.09.2026)drop_type_vars(): When passing in a list of data frames, the function now removes the variablesTYPE,TYPE_NRandDEPTHfrom all data frames within the list. (22.09.2026)retain_stat(): Can now generate cumulative values. (23.09.2026)multi_join(): Single variables passed to theonparameter can now be written without quotation marks. (25.09.2026)any_table(),excel_output_style(): The newblock_bordersstyle parameter enables to draw borders between statistic blocks within the table area. (25.09.2026)transpose_plus(): If specificstatisticsare chosen per variable then now thevaluesparameter can be omitted. (26.09.2026)keep(),dropp(),retain_variables(),add_variable_range: Are now able to select variable ranges by pattern. When writing e.g. age1-age10 (the hyphen triggers this behaviour) then alle "age" variables from 1 to 10 are selected regardless of where they are located in the data set. (29.09.2026)do_if(): Is now also able to use the new writing style with conditions as characters introduced byifelse_multi(). (30.09.2026)rename_multi(): Single variables and vectors of variable names can now be renamed in the same call. (30.09.2026)
Show all changes in 1.3.6Hide the rest of the changes in 1.3.6
keep(),dropp(): Now also accept vectors. (30.09.2026)discrete_format(),interval_format(): Addedas_characterparamter which ensures that the value labels are kept as character. Meaning numbers like "00110" keep their leading zeros instead of beeing converted into numeric value 110. (30.09.2026)multi_join(): When joining more than two data frames the function is now able to join on key variables which are joined to the base data frame in the process. (06.10.2026)if.(),else_if.(),else.(): Are now able to use custom package functions likerecode.()in the assignment. (08.10.2026)if.(),else_if.(),else.(): Now add an attribute to the data frame which carries the currently active condition as a logical vector so that follow up statements can catch this and further work with an already handled condition. This enableselse_if.()andelse.()to not only work on NA values. (12.10.2026)do_if(),else_do(),end_do(),end_all_do(): Instead of adding variables to the data fame these functions now also handle conditions as attributes attached to the data frame. (12.10.2026)summarise_plus(),any_table():valuesandclassparameters now support SAS macro variable writing style. (14.10.2026)any_table():by,box,pct_group,pct_valueandpct_blockparameters now support SAS macro variable writing style. (16.10.2026)keep(),dropp(): Are now able to keep/drop columns with NA as name. (16.10.2026)frequencies(),crosstabs(),any_table(),recode(),sort_plus(),split_by(),summarise_plus(),transpose_plus():formatsparameter now supports SAS macro variable writing style. (17.10.2026)split_by(): Is now also able to use the new writing style with conditions as characters introduced byifelse_multi(). (20.10.2026)frequencies(),crosstabs(),any_table(): Are now able to handle value labels attached to variables. The result table will now display the labels instead of the plain values. Formats will always win over labels, meaning if a format is applied to a labelled variable, then the format values will be used. (22.10.2026)
Changed functionality
first_row_as_names(): Now also sets numeric values as variable names. (16.10.2026)frequencies(): Thevariablesparameter was replaced by an ellipsis.... Variables can now be listed separated by commas without wrapping them in c(). The vector writing style still works though. (23.10.2026)
Fixed
compute.(): Some custom functions didn't work consistently in different situations. This is fixed now. (21.09.2026)- Most of the functions couldn't resolve custom parameters passed on from a wrapper function by themselves. This is hopefully fixed. (22.09.2026)
compute.(): Doesn't error anymore when calculations are written on multiple lines. (24.09.2026)any_table(): Variable labels weren't set when the variable name contained astatisticskeyword. This is fixed now. (25.09.2026)any_table(): When working with pre summarised data then now the value variables appear in user provided order instead of order of appearance within the given data frame. (25.09.2026)running_number(): Now considers all variables when passing a vector of variable names intoby. (25.09.2026)if.(),else_if.(),ifelse_multi(),where.(): Don't error anymore on parsing variable names ending in a number. (25.09.2026)summarise_plus(): In case the function was used inside a custom function, percentiles weren't detected asstatistics. This is fixed now. (25.09.2026)transpose_plus(): If specificstatisticsare chosen per variable then now variable vectors without quotation marks can be passed. (26.09.2026)dropp(): Now ignores ranges which consist of two invalid variables instead of returning an empty data frame. (29.09.2026)if.(),else_if.(),ifelse_multi(),where.(): Now allow multi line character conditions instead of aborting with an error. (29.09.2026)if.(),else_if.(),ifelse_multi(),where.(),do_if(): In SAS like patterns like "15 <= age < 65" now formulas are accepted, e.g. "median * 60 / 100 <= income < median * 120 / 100". (30.09.2026)keep(),dropp(): Don't error anymore when duplicate variable names are passed or duplicates are generated in combination with variable ranges. (30.09.2026)if.(),else_if.(),ifelse_multi(),where.(),do_if(): German umlauts and ß should now work within character conditions. (03.10.2026)if.(),else_if.(),ifelse_multi(),where.(),do_if(): Conditions with theinoperator can now handle parentheses within quoted strings and line breaks. (09.10.2026)macro(): German umlauts and ß should now work within macro variable names. (03.10.2026)print_step(): Multi line messages are now reduced to one liners to make sure they won't be displayed twice. (14.10.2026)summarise_plus(): Now uses a custom median function for the weighted median since collapse::fmedian, which was used before, has a rare edge case bug (https://github.com/fastverse/collapse/issues/883), which sometimes leads to wrong results. (16.10.2026)frequencies(),crosstabs(),any_table(),recode(),sort_plus(),split_by(),summarise_plus(),transpose_plus(): When wrapping the functions inside a custom function, format names passed as parameter are now resolved correctly. (17.10.2026)summarise_plus(),frequencies(),any_table(),stack_data(): Functions shouldn't error anymore, if value labels are attached to variables. (21.10.2026)any_table(): Fixed a bug with deduplicating plain values. (22.10.2026)
Optimization
multi_join(): Now sorts all variables on theonvariables before joining, which has a big impact when joining larger data frames on multiple key variables. Smaller joins might suffer from a small penalty because of that, but this should be neglectable. (29.09.2026)
Additionally
if.(),else_if.(),else.(): Now the messages also display the condition and not only target variable and value. (03.10.2026)test_package(),test_single_file(): Now print an install diolog instead of just a note if tinytest is not installed. (03.10.2026)rename_multi(): Now throws a warning when a new variable name is already in the data frame. (08.10.2026)compute.(): The duplicate variable name note now only displays the unique variable names. (08.10.2026)load_file_multi(): Doesn't run intostack_data()anymore, if only one file is loaded. (14.10.2026)import_multi (): Doesn't run intostack_data()anymore, if only one file is loaded. (16.10.2026)
From NEWS.md in the release
Install
Health
- OK13 OK2026-08-05
- NOTE12 OK, 1 NOTE2026-08-01
- OK13 OK2026-07-03
- ERROR11 OK, 1 ERROR2026-04-25
- OK14 OK2026-04-11
Show 4 earlier changesHide 4 earlier changes
- ERROR13 OK, 1 ERROR2026-04-09
- OK14 OK2026-03-25
- ERROR13 OK, 1 ERROR2026-03-21
- OK14 OK2026-03-10
Documentation
The repository also keeps web-only articles.
- Help pages
- 70 (6 internal)includes a package overview page
- Examples that run
- 100%64 run in a plain check
- Exported functions with examples
- 93%
- Documented parameters
- 99%
- Return-value docs
- 100%
- Help pages citing references
- 0%
Downloads
Repository
- PRs merged (all time)
- 75%
- Median days to close, 50 most recently updated closed issues
- 1
- Median days to close, 50 most recently updated closed PRs
- 0
Stars over time
Forks over time
Releases over time
Issues over time
PRs over time
Commits over time
6 development-tooling and community-health practices detected across 4 families in the upstream repository
Checks run against github.com/s3rdia/qol on 2026-10-25.
GitHub Pages site last deployed 2026-10-23
pkgdown site last built 2026-10-23, before release 1.3.6 (2026-10-25)
Dependencies
Installing qol adds 8 packages (7 with compiled code, 22 MB of source tarballs). Heaviest: stringi 11 MB, data.table 5.7 MB, Rcpp 1.8 MB.
Code & Tests
Datasets
People & History
Pick two releases to compare their code metrics.
- 1.3.6Latest2026-10-25 · current release · diff ↗ ··
added 1 export
end_if.48 hours in CRAN's queue
Listed in CRAN's incoming queue from 2026-10-23 19:40 to 2026-10-25 19:37 UTC, in 14 readings. - 1.3.52026-09-20 · diff ↗
- 1.3.42026-07-16 · diff ↗ ·
removed 1 export
get_integer_lengthadded 6 exports
check_required_package, create_table_of_contents, run_folder, run_project, run_project_parallel, run_script - 1.3.3
- 1.3.22026-06-16 · diff ↗ ·
removed 5 exports
get_stat_labels, get_variable_labels, retain_sum, set_stat_labels, set_variable_labelsadded 4 exports
code_statistics, get_labels, retain_stat, set_labels - 1.3.12026-05-16 · diff ↗ ·
removed 2 exports
compute, recodeadded 3 exports
compute., recode., set_no_color - RR 4.6.0 released · 2026-04-24
- 1.3.02026-04-18 · diff ↗ ·
added 29 exports
compute, convert_square_brackets, do_if, else_do, end_all_do, end_do, get_message_stack, get_threads, hex_to_256, hex_to_ansi, load_file, load_file_multi, print_closing, print_headline, print_message, print_stack_as_messages, print_start_message, print_step, qol_chat, report_test_results, round_multi, row_calculation, save_file, save_file_multi, set_no_print, set_threads, set_up_custom_message, test_package, test_single_file - 1.2.2
- 1.2.12026-02-11 · diff ↗ ·
added 14 exports
apply_macro, concat, expand_formats, export_multi, free_memory, get_duplicate_var_count, get_duplicate_var_names, get_print_miss, import_multi, macro, remove_blanks, set_print_miss, sub_string, where. - 1.2.02026-01-13 · diff ↗ ·
removed 3 exports
is_numeric, split_by_condition, split_by_varadded 42 exports
add_variable_range, check_weight, close_file, content_report, convert_factor, dots_to_char, export_data, first_row_as_names, get_footnotes, get_integer_length, get_monitor, get_na.rm, get_origin_as_char, get_output, get_print, get_stat_labels, get_style_options, get_titles, get_variable_labels, import_data, part_of_df, qol_news, remove_doubled_values, rename_multi, reset_qol_options, reset_style_options, resolve_intersection, retain_variables, set, set_footnotes and 12 more - 1.1.1
- 1.1.02025-11-20 · diff ↗ ·
added 7 exports
build_master, build_rstheme, combine_into_workbook, mark_case, replace_except, retain_sum, retain_value - 1.0.22025-10-14 · diff ↗
- 1.0.12025-10-10
- RR 4.5.0 released · 2025-04-11
Package metadata
- First published
- 2025-10-10
- Total releases
- 14 / 1 yrs
- License
- MIT + file LICENSE OSI
- Minimum R
- ≥ 4.1.0
- Download size
- 860 KB
Cite
Cite this package
Run in R for the authors' preferred citation:
citation("qol")This package has no citation file, so citation() returns this entry built from DESCRIPTION.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-26, which the citation names so these numbers can be found later. More on citing and the projects behind them.