
A Business Intelligence Toolkit for Financial Planning & Analysis (FP&A)
ti package is a collection of business intelligence tools designed to
simplify common financial planning and analysis (FP&A) tasks such as
time intelligence calculations and group member segmentation.
The package is inspired by best practices from a collection of blogs,
books, industry research, and hands-on work experience, consolidating
frequently performed business analyses into a fast, efficient, and
reusable framework.
In particular, the time intelligence functions are heavily inspired by
PowerBI DAX functions.
Under the hood, these functions are built upon the great foundations of:
All functions work with either tibbles or a ‘DuckDB’ database table,
with the same syntax. Everything runs as a single read-only query, so no
tables are written to your database. Support for other databases will
come in a later release.
Even if you are working with tibbles, all functions are optimized to
leverage DuckDB for increased
speed and performance[^1]
By default, all functions return a lazy DBI object which you can return
as a tibble with dplyr::collect()
Key features & benefits
-
Unified syntax regardless if your data is in a tibble or a
database
-
Scale your data with duckdb
to optimize your calculations
-
Instant clarity as every function summarizes its transformation
actions so that you can understand and validate the results
Installation
Install the development version from Codeberg:
remotes::install_git("https://codeberg.org/usrbinr/ti")
pak::pak("ti")
What is in ti?
We recommend using the Contoso
package for any practice analysis. The contoso datasets are fictional
business transactions of the Contoso toy company which are helpful for
business intelligence related analysis
There are 2 main categories of functions:
- Time intelligence related functions
(Table 1)
- Categorization strategies
(Table 2)
Time intelligence
This is a collection of the most commonly used time intelligence
analysis such as Year-over-Year(yoy()),
Month-to-Date(mtd()), and Current Year-to-Date over Previous
Year-to-Date (ytdopy()) analysis.
These functions are designed to quickly answer questions in a
consistent, fast and transparent way.
Key benefits:
-
Auto-fill missing dates: Ensures no missing periods in your
datasets so that correct period comparisons are performed
-
Flexible calendar options: Handle comparisons based on a
standard or non-standard fiscal calendar to accommodate
different reporting frameworks
-
Clear definition: Full transparency into the calculations that are
performed, with visibility to any missing or incomplete date periods
Below is the full list of time intelligence functions:
Table 1
<style>@import url("https://fonts.googleapis.com/css2?family=Fira+Code:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
#zzeebxppdt table {
font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
#zzeebxppdt thead, #zzeebxppdt tbody, #zzeebxppdt tfoot, #zzeebxppdt tr, #zzeebxppdt td, #zzeebxppdt th {
border-style: none;
}
#zzeebxppdt p {
margin: 0;
padding: 0;
}
#zzeebxppdt .gt_table {
display: table;
border-collapse: collapse;
line-height: normal;
margin-left: auto;
margin-right: auto;
color: #333333;
font-size: 16px;
font-weight: normal;
font-style: normal;
background-color: #FFFFFF;
width: auto;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #A8A8A8;
border-right-style: none;
border-right-width: 2px;
border-right-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #A8A8A8;
border-left-style: none;
border-left-width: 2px;
border-left-color: #D3D3D3;
}
#zzeebxppdt .gt_caption {
padding-top: 4px;
padding-bottom: 4px;
}
#zzeebxppdt .gt_title {
color: #333333;
font-size: 125%;
font-weight: initial;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 5px;
padding-right: 5px;
border-bottom-color: #FFFFFF;
border-bottom-width: 0;
}
#zzeebxppdt .gt_subtitle {
color: #333333;
font-size: 85%;
font-weight: initial;
padding-top: 3px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
border-top-color: #FFFFFF;
border-top-width: 0;
}
#zzeebxppdt .gt_heading {
background-color: #FFFFFF;
text-align: center;
border-bottom-color: #FFFFFF;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
}
#zzeebxppdt .gt_bottom_border {
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
}
#zzeebxppdt .gt_col_headings {
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
}
#zzeebxppdt .gt_col_heading {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: normal;
text-transform: inherit;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
vertical-align: bottom;
padding-top: 5px;
padding-bottom: 6px;
padding-left: 5px;
padding-right: 5px;
overflow-x: hidden;
}
#zzeebxppdt .gt_column_spanner_outer {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: normal;
text-transform: inherit;
padding-top: 0;
padding-bottom: 0;
padding-left: 4px;
padding-right: 4px;
}
#zzeebxppdt .gt_column_spanner_outer:first-child {
padding-left: 0;
}
#zzeebxppdt .gt_column_spanner_outer:last-child {
padding-right: 0;
}
#zzeebxppdt .gt_column_spanner {
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
vertical-align: bottom;
padding-top: 5px;
padding-bottom: 5px;
overflow-x: hidden;
display: inline-block;
width: 100%;
}
#zzeebxppdt .gt_spanner_row {
border-bottom-style: hidden;
}
#zzeebxppdt .gt_group_heading {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
text-transform: inherit;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
vertical-align: middle;
text-align: left;
}
#zzeebxppdt .gt_empty_group_heading {
padding: 0.5px;
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
vertical-align: middle;
}
#zzeebxppdt .gt_from_md > :first-child {
margin-top: 0;
}
#zzeebxppdt .gt_from_md > :last-child {
margin-bottom: 0;
}
#zzeebxppdt .gt_row {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
margin: 10px;
border-top-style: solid;
border-top-width: 1px;
border-top-color: #D3D3D3;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
vertical-align: middle;
overflow-x: hidden;
}
#zzeebxppdt .gt_stub {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
text-transform: inherit;
border-right-style: solid;
border-right-width: 2px;
border-right-color: #D3D3D3;
padding-left: 5px;
padding-right: 5px;
}
#zzeebxppdt .gt_stub_row_group {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
text-transform: inherit;
border-right-style: solid;
border-right-width: 2px;
border-right-color: #D3D3D3;
padding-left: 5px;
padding-right: 5px;
vertical-align: top;
}
#zzeebxppdt .gt_row_group_first td {
border-top-width: 2px;
}
#zzeebxppdt .gt_row_group_first th {
border-top-width: 2px;
}
#zzeebxppdt .gt_summary_row {
color: #333333;
background-color: #FFFFFF;
text-transform: inherit;
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
}
#zzeebxppdt .gt_first_summary_row {
border-top-style: solid;
border-top-color: #D3D3D3;
}
#zzeebxppdt .gt_first_summary_row.thick {
border-top-width: 2px;
}
#zzeebxppdt .gt_last_summary_row {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
}
#zzeebxppdt .gt_grand_summary_row {
color: #333333;
background-color: #FFFFFF;
text-transform: inherit;
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
}
#zzeebxppdt .gt_first_grand_summary_row {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
border-top-style: double;
border-top-width: 6px;
border-top-color: #D3D3D3;
}
#zzeebxppdt .gt_last_grand_summary_row_top {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
border-bottom-style: double;
border-bottom-width: 6px;
border-bottom-color: #D3D3D3;
}
#zzeebxppdt .gt_striped {
background-color: rgba(128, 128, 128, 0.05);
}
#zzeebxppdt .gt_table_body {
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
}
#zzeebxppdt .gt_footnotes {
color: #333333;
background-color: #FFFFFF;
border-bottom-style: none;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 2px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 2px;
border-right-color: #D3D3D3;
}
#zzeebxppdt .gt_footnote {
margin: 0px;
font-size: 90%;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 5px;
padding-right: 5px;
}
#zzeebxppdt .gt_sourcenotes {
color: #333333;
background-color: #FFFFFF;
border-bottom-style: none;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 2px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 2px;
border-right-color: #D3D3D3;
}
#zzeebxppdt .gt_sourcenote {
font-size: 90%;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 5px;
padding-right: 5px;
}
#zzeebxppdt .gt_left {
text-align: left;
}
#zzeebxppdt .gt_center {
text-align: center;
}
#zzeebxppdt .gt_right {
text-align: right;
font-variant-numeric: tabular-nums;
}
#zzeebxppdt .gt_font_normal {
font-weight: normal;
}
#zzeebxppdt .gt_font_bold {
font-weight: bold;
}
#zzeebxppdt .gt_font_italic {
font-style: italic;
}
#zzeebxppdt .gt_super {
font-size: 65%;
}
#zzeebxppdt .gt_footnote_marks {
font-size: 75%;
vertical-align: 0.4em;
position: initial;
}
#zzeebxppdt .gt_asterisk {
font-size: 100%;
vertical-align: 0;
}
#zzeebxppdt .gt_indent_1 {
text-indent: 5px;
}
#zzeebxppdt .gt_indent_2 {
text-indent: 10px;
}
#zzeebxppdt .gt_indent_3 {
text-indent: 15px;
}
#zzeebxppdt .gt_indent_4 {
text-indent: 20px;
}
#zzeebxppdt .gt_indent_5 {
text-indent: 25px;
}
#zzeebxppdt .katex-display {
display: inline-flex !important;
margin-bottom: 0.75em !important;
}
#zzeebxppdt div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt-tr-group-header > div.rt-th-group:after {
height: 0px !important;
}
</style>
| Time
Intelligence Functions |
| Function |
Description |
Shift |
Aggregate |
Compare |
| YoY |
Full Year over
Year |
|
X |
X |
| YTD |
Year-to-Date |
|
X |
|
| PYTD |
Prior Year-to-Date
amount |
X |
X |
|
| YoYTD |
Current
Year-to-Date over Prior Year-to-Date |
X |
X |
X |
| YTDOPY |
Year-to-Date over Full
Previous Year |
X |
X |
X |
| QoQ |
Full Quarter
over Quarter |
|
X |
X |
| QTD |
Quarter-to-Date |
|
X |
|
| PQTD |
Prior
Quarter-to-Date |
X |
X |
|
| QOQTD |
Quarter-over-Quarter-to-Date |
X |
X |
X |
| QTDOPQ |
Quarter-to-Date over Full Previous Quarter |
X |
X |
X |
| MTD |
Month-to-Date |
|
X |
|
| MoM |
Full Month
over Full Month |
|
X |
X |
| MoMTD |
Current Month-to-Date
over Prior Month-to-Date |
X |
X |
X |
| PMTD |
Prior
Month's MTD amount |
X |
X |
|
| MTDOPM |
Month-to-Date over Full
Previous Month |
X |
X |
X |
| WTD |
Week-to-Date |
|
X |
|
| WoW |
Full Week over Full
Week |
|
X |
X |
| WoWTD |
Current
Week-to-Date over Prior Week-to-Date |
X |
X |
X |
| PWTD |
Prior Week-to-Date |
X |
X |
|
| ATD |
Cumulative
total from inception to date |
|
X |
|
| DoD |
Full Day over Full
Day |
|
X |
X |
Classification Strategies
ABC Classification
ABC classification is a business analysis technique that categorizes
items (like products, customers, or suppliers) based on their relative
contribution of a value. It expands upon the Pareto Principle (the 80/20
rule), allowing the user to determine which percentage of items or group
members contribute to the largest percentage of the total value.
You assign the break points for the categorization and the function will
label each category with a letter value.
Cohort
Cohort analysis is a type of behavioral analytics that takes data from a
given group of users (called a cohort) and tracks their activity over
time. A cohort is typically defined by a shared starting characteristic,
most commonly the time period in which the entities first interacted
with the product or service.
This allows you to understand retention, turnover and other cohort
attributes more clearly.
Table 2
<style>@import url("https://fonts.googleapis.com/css2?family=Fira+Code:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
#kpshklwisp table {
font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
#kpshklwisp thead, #kpshklwisp tbody, #kpshklwisp tfoot, #kpshklwisp tr, #kpshklwisp td, #kpshklwisp th {
border-style: none;
}
#kpshklwisp p {
margin: 0;
padding: 0;
}
#kpshklwisp .gt_table {
display: table;
border-collapse: collapse;
line-height: normal;
margin-left: auto;
margin-right: auto;
color: #333333;
font-size: 16px;
font-weight: normal;
font-style: normal;
background-color: #FFFFFF;
width: auto;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #A8A8A8;
border-right-style: none;
border-right-width: 2px;
border-right-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #A8A8A8;
border-left-style: none;
border-left-width: 2px;
border-left-color: #D3D3D3;
}
#kpshklwisp .gt_caption {
padding-top: 4px;
padding-bottom: 4px;
}
#kpshklwisp .gt_title {
color: #333333;
font-size: 125%;
font-weight: initial;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 5px;
padding-right: 5px;
border-bottom-color: #FFFFFF;
border-bottom-width: 0;
}
#kpshklwisp .gt_subtitle {
color: #333333;
font-size: 85%;
font-weight: initial;
padding-top: 3px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
border-top-color: #FFFFFF;
border-top-width: 0;
}
#kpshklwisp .gt_heading {
background-color: #FFFFFF;
text-align: center;
border-bottom-color: #FFFFFF;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
}
#kpshklwisp .gt_bottom_border {
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
}
#kpshklwisp .gt_col_headings {
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
}
#kpshklwisp .gt_col_heading {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: normal;
text-transform: inherit;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
vertical-align: bottom;
padding-top: 5px;
padding-bottom: 6px;
padding-left: 5px;
padding-right: 5px;
overflow-x: hidden;
}
#kpshklwisp .gt_column_spanner_outer {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: normal;
text-transform: inherit;
padding-top: 0;
padding-bottom: 0;
padding-left: 4px;
padding-right: 4px;
}
#kpshklwisp .gt_column_spanner_outer:first-child {
padding-left: 0;
}
#kpshklwisp .gt_column_spanner_outer:last-child {
padding-right: 0;
}
#kpshklwisp .gt_column_spanner {
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
vertical-align: bottom;
padding-top: 5px;
padding-bottom: 5px;
overflow-x: hidden;
display: inline-block;
width: 100%;
}
#kpshklwisp .gt_spanner_row {
border-bottom-style: hidden;
}
#kpshklwisp .gt_group_heading {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
text-transform: inherit;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
vertical-align: middle;
text-align: left;
}
#kpshklwisp .gt_empty_group_heading {
padding: 0.5px;
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
vertical-align: middle;
}
#kpshklwisp .gt_from_md > :first-child {
margin-top: 0;
}
#kpshklwisp .gt_from_md > :last-child {
margin-bottom: 0;
}
#kpshklwisp .gt_row {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
margin: 10px;
border-top-style: solid;
border-top-width: 1px;
border-top-color: #D3D3D3;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
vertical-align: middle;
overflow-x: hidden;
}
#kpshklwisp .gt_stub {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
text-transform: inherit;
border-right-style: solid;
border-right-width: 2px;
border-right-color: #D3D3D3;
padding-left: 5px;
padding-right: 5px;
}
#kpshklwisp .gt_stub_row_group {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
text-transform: inherit;
border-right-style: solid;
border-right-width: 2px;
border-right-color: #D3D3D3;
padding-left: 5px;
padding-right: 5px;
vertical-align: top;
}
#kpshklwisp .gt_row_group_first td {
border-top-width: 2px;
}
#kpshklwisp .gt_row_group_first th {
border-top-width: 2px;
}
#kpshklwisp .gt_summary_row {
color: #333333;
background-color: #FFFFFF;
text-transform: inherit;
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
}
#kpshklwisp .gt_first_summary_row {
border-top-style: solid;
border-top-color: #D3D3D3;
}
#kpshklwisp .gt_first_summary_row.thick {
border-top-width: 2px;
}
#kpshklwisp .gt_last_summary_row {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
}
#kpshklwisp .gt_grand_summary_row {
color: #333333;
background-color: #FFFFFF;
text-transform: inherit;
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
}
#kpshklwisp .gt_first_grand_summary_row {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
border-top-style: double;
border-top-width: 6px;
border-top-color: #D3D3D3;
}
#kpshklwisp .gt_last_grand_summary_row_top {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
border-bottom-style: double;
border-bottom-width: 6px;
border-bottom-color: #D3D3D3;
}
#kpshklwisp .gt_striped {
background-color: rgba(128, 128, 128, 0.05);
}
#kpshklwisp .gt_table_body {
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
}
#kpshklwisp .gt_footnotes {
color: #333333;
background-color: #FFFFFF;
border-bottom-style: none;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 2px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 2px;
border-right-color: #D3D3D3;
}
#kpshklwisp .gt_footnote {
margin: 0px;
font-size: 90%;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 5px;
padding-right: 5px;
}
#kpshklwisp .gt_sourcenotes {
color: #333333;
background-color: #FFFFFF;
border-bottom-style: none;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 2px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 2px;
border-right-color: #D3D3D3;
}
#kpshklwisp .gt_sourcenote {
font-size: 90%;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 5px;
padding-right: 5px;
}
#kpshklwisp .gt_left {
text-align: left;
}
#kpshklwisp .gt_center {
text-align: center;
}
#kpshklwisp .gt_right {
text-align: right;
font-variant-numeric: tabular-nums;
}
#kpshklwisp .gt_font_normal {
font-weight: normal;
}
#kpshklwisp .gt_font_bold {
font-weight: bold;
}
#kpshklwisp .gt_font_italic {
font-style: italic;
}
#kpshklwisp .gt_super {
font-size: 65%;
}
#kpshklwisp .gt_footnote_marks {
font-size: 75%;
vertical-align: 0.4em;
position: initial;
}
#kpshklwisp .gt_asterisk {
font-size: 100%;
vertical-align: 0;
}
#kpshklwisp .gt_indent_1 {
text-indent: 5px;
}
#kpshklwisp .gt_indent_2 {
text-indent: 10px;
}
#kpshklwisp .gt_indent_3 {
text-indent: 15px;
}
#kpshklwisp .gt_indent_4 {
text-indent: 20px;
}
#kpshklwisp .gt_indent_5 {
text-indent: 25px;
}
#kpshklwisp .katex-display {
display: inline-flex !important;
margin-bottom: 0.75em !important;
}
#kpshklwisp div.Reactable > div.rt-table > div.rt-thead > div.rt-tr.rt-tr-group-header > div.rt-th-group:after {
height: 0px !important;
}
</style>
| Classification
Functions |
| Function |
Description |
Categorizes |
Time-Based |
Tracks
Over Time |
| abc() |
ABC Classification
groups items by relative contribution (Pareto analysis). |
X |
|
|
| cohort() |
Cohort
analysis groups entities by a shared start point and analyzes behavior
over time. |
|
X |
X |
Additional references and inspirations
[^1]: I plan to use
duckplyr once it
expands support for lubridate functions