Просмотрите файл транзакции, чтобы получить средние цены на продукты - PullRequest
1 голос
/ 08 мая 2019

Я работаю над файлом данных, который содержит информацию о продажах товаров из различных сетей магазинов, например. супермаркеты. (Взято из этого набора данных на случай, если кто-то знаком). Файл содержит несколько полей:

  1. id - уникальный идентификатор клиента
  2. chain - идентификатор сети магазинов
  3. отдел - совокупная группировка категории (например, вода)
  4. категория - категория продукта (например, газированная вода)
  5. company - Идентификатор компании, которая продает товар
  6. brand - идентификатор бренда, которому принадлежит товар
  7. дата - дата покупки
  8. productsize - сумма покупки продукта (например, 16 унций воды)
  9. productmeasure - Единицы покупки продукта (например, унции)
  10. количество закупок - Количество приобретенных единиц
  11. purchaseamount - долларовая сумма покупки
  12. productprice - Цена товара (определяется по количеству покупок / количеству закупок)

Я хочу рассчитать среднюю цену по набору данных транзакций для каждого продукта. Для этого упражнения я предполагаю, что я могу определить уникальный продукт по следующим полям: категория, марка, размер продукта, чтобы любой уникальный продукт соответствовал уникальной комбинации этих 3 полей.

Итак, сначала я идентифицирую уникальные элементы в наборе данных, чтобы получить список всех продуктов:

#transactions is the name of the data frame
items <- unique(transactions %>% select(category, brand, productsize))

Теперь я могу использовать это в качестве справочной таблицы для выбора уникальных продуктов из набора данных транзакций и получения средней цены для каждого из них.

Поскольку я новичок, мне удалось заставить его работать только с (не совсем элегантно) для цикла :

for (i in 1:nrow(items)) {
  temp1 <- filter(transactions, category==items[i,1])
  temp2 <- filter(temp1, brand==items[i,2])
  temp3 <- filter(temp2, productsize==items[i,3])
  items$meanvalue[i]<- mean(temp3$productprice)
}

Это работает, но, конечно, это очень медленно. Во фрейме данных транзакция имеется 480612 записей, а во фрейме данных items - 56658. У меня нет опыта работы с большими наборами данных, но я уверен, что проблема связана с кодом, не так большой размер.

Пример файла (300 строк) в pastebin .

РЕДАКТИРОВАТЬ: Обнаружил, что summarise очень хорошо работает с этим!

avgPrice <- transactions %>% group_by(category, brand, productsize) %>% summarise(avgPrice = mean(productprice))

1 Ответ

1 голос
/ 09 мая 2019

Так как R векторизовано, это должно быть намного быстрее, чем при использовании цикла for!

# library(tidyverse) # if needed

# get item combinations
itemCombs <- transactions %>% 
  group_by(category, brand, productsize) %>% 
  slice(1) %>% 
  ungroup() %>% 
  mutate(item = 1:n()) %>% 
  select(item, everything())

# append item combinations to original dataset and calculate avg price per item 
avgPrice <- transactions %>% 
  left_join(itemCombs, by = c("category", "brand", "productsize")) %>% 
  select(item, productprice) %>% 
  arrange(item) %>% 
  group_by(item) %>% 
  mutate(nItems = n(),
         sumPrice = sum(productprice)) %>% 
  ungroup() %>% 
  mutate(avgPrice = sumPrice/nItems)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...