Создадим OLAP-куб с продажами нескольких видов товара в ряде магазинов с известными местами расположения по месяцам и кварталам 2019 года. Данные по выручке от продаж товара генерируем случайным образом. Этот пример взят с сайта dzone.com.

Таблицы измерений для гиперкуба:

key name country
CA Калифорния США
NY Нью Йорк США
WA Вашингтон США
ON Онтарио Канада
QU Квебек Канада
key desc quarter
1 Янв Q1
2 Фев Q1
3 Март Q1
4 Апр Q2
5 Май Q2
6 Июнь Q2
7 Июль Q3
8 Авг Q3
9 Сен Q3
10 Окт Q4
11 Ноя Q4
12 Дек Q4
key price
Принтер 225
Планшет 570
Ноутбук 1120

Первые строки таблицы фактов: выручка (столбец amount) по периодам времени, локациям и товарам. Всего в таблице 500 строк и 7 столбцов.

month quarter year loc prod unit amount
1 Q1 2018 NY Ноутбук 1 225
1 Q1 2018 ON Планшет 2 1140
1 Q1 2018 ON Ноутбук 2 450
1 Q1 2018 QU Планшет 1 570
1 Q1 2018 NY Принтер 1 1120
1 Q1 2018 CA Принтер 1 1120

Построим гиперкуб и рассчитаем сводную таблицу: продажи ноутбуков по кварталам и локациям.

# Строим куб -------------------------------------------------------------------

# агрегируем выручку по измерениям, для времени используем кварталы (quarter) 
revenue_cube <- tapply(sales_fact$amount, sales_fact[, c('prod', 'quarter', 
                                                         'year', 'loc')], 
                       FUN = function(x){return(sum(x))})

# Pivot - Сводная таблица ------------------------------------------------------
#  продажи ноутбуков по кварталам 2018 и локациям
tbl <- apply(revenue_cube['Ноутбук', , '2018', ], c('quarter', 'loc'), 
             FUN = function(x) {return(sum(x, na.rm = TRUE))})
# отображение таблицы
kable(tbl)
CA NY ON QU WA
Q1 2250 900 1125 225 0
Q2 1350 450 225 450 450
Q3 1125 1800 900 675 2025
Q4 1350 900 1575 1125 675

Теперь просуммируем продажи ноутбуков по годам и локациям.

#  продажи ноутбуков по годам и локациям
tbl <- apply(revenue_cube['Ноутбук', , , ], c('year', 'loc'), 
             FUN = function(x) {return(sum(x, na.rm = TRUE))})
# отображение таблицы
kable(tbl)
CA NY ON QU WA
2018 6075 4050 3825 2475 3150
2019 8100 6300 2925 2025 3600

Построим по последней сводной таблице график.

barplot(as.matrix(tbl), beside = T, col = c('aquamarine3', 'coral'),
        main = 'Продажи ноутбуков по локациям')
legend('topright', fill = c('aquamarine3', 'coral'), legend = c(2018, 2019))