Skip to content

Powerful 'SAS' Inspired Concepts for more Efficient Bigger Outputs

0packages depend
5.1Kdownloads / year
87.5%test coverage
13/13flavors OK

Overview

About

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.

Changes in 1.3.6

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 the values parameter 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 first on list 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 variables TYPE, TYPE_NR and DEPTH from 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 the on parameter can now be written without quotation marks. (25.09.2026)
  • any_table(), excel_output_style(): The new block_borders style parameter enables to draw borders between statistic blocks within the table area. (25.09.2026)
  • transpose_plus(): If specific statistics are chosen per variable then now the values parameter 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 by ifelse_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(): Added as_character paramter 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 like recode.() 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 enables else_if.() and else.() 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(): values and class parameters now support SAS macro variable writing style. (14.10.2026)
  • any_table(): by, box, pct_group, pct_value and pct_block parameters 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(): formats parameter 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 by ifelse_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(): The variables parameter 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 a statistics keyword. 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 into by. (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 as statistics. This is fixed now. (25.09.2026)
  • transpose_plus(): If specific statistics are 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 the in operator 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 the on variables 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 into stack_data() anymore, if only one file is loaded. (14.10.2026)
  • import_multi (): Doesn't run into stack_data() anymore, if only one file is loaded. (16.10.2026)

From NEWS.md in the release

Install

Health

CRAN checks
13OK
Slowest check: 7.5 min · r-oldrel-macos-x86_64
Status changes
  • 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
Advisories

none known

Documentation

In release 1.3.6
READMEYes · 849 wordsVignettesNoNEWSYes · 100% structured · mentions 1.3.6Citation fileNoWebsiteYes · pkgdown

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

5.1K
CRAN downloads in the past year
Rank #7,832 · ~14/day · ~427/mo
Daily download trend is not available in this view yet.
48030 days
1.2K90 days
5.1K1 year
Compare downloads with other packages →
Also on169 r2u3 autocran

Repository

22Stars
1Forks
0Open issues
0Open PRs
12Releases
276Commits
2Commit identities
crancran-rdata-analysisdata-manipulationexcelexcel-exportformatshigh-performance
276 commits · Last activity 2026-10-23 · 0% stars, 30d · Discussions: 1 post
Responsiveness
How these are sampled
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

2025-10-24 · 42026-08-22 · 22
PracticesBeta

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.

Docs source (3)
README.Rmdpkgdown

GitHub Pages site last deployed 2026-10-23

pkgdown site last built 2026-10-23, before release 1.3.6 (2026-10-25)

CRAN release process (1)
cran-comments.md
Lint, format, editor (1)
RStudio project
Git structural (1)
.gitattributes
How this is detected·Detection ruleset v4 (2026-10-20)

Dependencies

Declared dependencies
7 external dependencies (excludes base and recommended)

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.

Depends (1)
R >= 4.1.0
LinkingTo (0)
none
Enhances (0)
none
Reverse dependencies
0direct
0indirect

Nothing depends on this yet.

Datasets

People & History

People (1)
Author, Maintainer since 1.0.1 (2025), Copyright holder
Releases (14)

Pick two releases to compare their code metrics.

  • 1.3.6Latest
    record
    2026-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.5
    record
    2026-09-20 · diff ↗
  • 1.3.4
    record
    2026-07-16 · diff ↗ ·
    removed 1 export
    get_integer_length
    added 6 exports
    check_required_package, create_table_of_contents, run_folder, run_project, run_project_parallel, run_script
  • 1.3.3
    record
    2026-07-16 · diff ↗ ·
    removed 1 export
    set
    added 2 exports
    ifelse_multi, stack_data
  • 1.3.2
    record
    2026-06-16 · diff ↗ ·
    removed 5 exports
    get_stat_labels, get_variable_labels, retain_sum, set_stat_labels, set_variable_labels
    added 4 exports
    code_statistics, get_labels, retain_stat, set_labels
  • 1.3.1
    record
    2026-05-16 · diff ↗ ·
    removed 2 exports
    compute, recode
    added 3 exports
    compute., recode., set_no_color
  • R
    R 4.6.0 released · 2026-04-24
  • 1.3.0
    record
    2026-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
    record
    2026-03-11 · diff ↗ ·
    added 1 export
    round_values
  • 1.2.1
    record
    2026-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.0
    record
    2026-01-13 · diff ↗ ·
    removed 3 exports
    is_numeric, split_by_condition, split_by_var
    added 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
    record
    2025-12-13 · diff ↗ ·
    added 2 exports
    libname, multi_join
  • 1.1.0
    record
    2025-11-20 · diff ↗ ·
    added 7 exports
    build_master, build_rstheme, combine_into_workbook, mark_case, replace_except, retain_sum, retain_value
  • 1.0.2
    record
    2025-10-14 · diff ↗
  • 1.0.1
    record
    2025-10-10
  • R
    R 4.5.0 released · 2025-04-11
Across CRAN, the median accepted release of the past year spent 22 hours in the queue, 90% under 11 days.How queue time is measured

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")
Siebenmorgen, T. (2026). qol: Powerful 'SAS' Inspired Concepts for more Efficient Bigger Outputs (Version 1.3.6) [Computer software]. https://doi.org/10.32614/CRAN.package.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.

APA

Balamuta, J. J. (2026). R Observatory: Metrics for qol version 1.3.6 [Data set]. HJJB, LLC. Data release v2026-10-26. https://doi.org/10.5281/zenodo.21843040

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.

Report a problem with this page →

Privacy choices

These apply to this browser and are stored on this device only. Nothing about your choice is sent to us.

Read the privacy policy