Рецепты

SQL запросы к DataFrame

Posted

Как я рассказывал – начинал я со стандартной описательной аналитики в связке Data-WareHouse (на SQL) + Excel.
Так вот, придя в R мне концепция DataFrame-ов первое время очень сильно напоминала понятие таблицы из реляционной базы данных. И неперестроенные мозги первое время при работе с данными мыслили в терминах SQL-запросов. А реальные задачи уже надо было решать очень быстро, времени перестраиваться и переучиваться и усваивать особо не было. И тогда я нашел себе волшебный пакет, и смог некоторое время работать именно «старых» понятиях (ну для меня) – SQL-запросов.
Загрузим этот пакет
library(sqldf)
Для демонстрации концепции, рассмотрим типовой упрощенный пример для стандартной, описательной бизнес-аналитики. Есть два таблицы – справочника клиенты и товары, и одна таблица с фактами продаж. Требуется – подготовить отчет о продажах товаров клиентам.
Создадим таблицы-справочники:

customers <- data.frame(
id_cust=c(1,2,3,4,5),
name_cust=c('Лютик','Ромашка','Василек','Гвоздика','Пион')
)

goods <- data.frame(
id_goods=c(1,2,3,4),
name_goods=c('Натрий','Калий','Хлор','Фосфор')
)


Таблица с фактами продаж:

sales <- data.frame(
id_cust =c( 1, 1, 4, 3, 3, 2),
id_goods=c( 3, 3, 1, 2, 3, 4),
amount =c(10,11,33,22,12,18)
)


А теперь простым SQL-запросом, но в R сделаем отчет:

sqldf("
select c.name_cust, g.name_goods, sum(s.amount)
from sales s, customers c, goods g
where c.id_cust=s.id_cust
and g.id_goods=s.id_goods
group by c.name_cust, g.name_goods
")

Результат – как ожидался:

name_cust name_goods sum(s.amount)
1 Василек Калий 22
2 Василек Хлор 12
3 Гвоздика Натрий 33
4 Лютик Хлор 21
5 Ромашка Фосфор 18

Добавить комментарий