Skip to content

qol 1.3.6 - CRAN release

Latest

Choose a tag to compare

@s3rdia s3rdia released this 26 Oct 19:02

I am probably repeating myself, but the updates keep getting bigger instead of smaller. The good thing is though that what is implemented and what is fixed is becoming more and more specific. But what I completely forgot until now is: On October 10th was qol’s first birthday. Yeah! I somehow can’t believe how fast a year can pass. In any case I am very happy with how things shaped out and a bit shocked in how big this got. And it will become even bigger. Some of the highlights are shown here in a bit more detail: https://s3rdia.github.io/qol_blog/posts/16.%20Update%201.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)
  • 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 (fastverse/collapse#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)