Я работаю над таблицей data.table, которая содержит, среди прочего, спрос на определенные продукты в определенных магазинах бизнес-франшизы. Цель состоит в том, чтобы предсказать спрос на каждый продукт в каждом магазине.
Вот заголовок моего набора данных:
голова (train_dataset)
Week | Store_ID | Product_ID | Sales | Returns | Demand |
---|---|---|---|---|---|
3 | 15766 | 1212 | 3 | 0 | 3 |
3 | 15766 | 1216 | 4 | 0 | 4 |
3 | 15766 | 1238 | 4 | 0 | 4 |
3 | 15766 | 1240 | 4 | 0 | 4 |
3 | 15766 | 1242 | 3 | 0 | 3 |
3 | 15766 | 1250 | 5 | 0 | 5 |
Мой первоначальный подход заключался в подмножестве исходного набора данных, чтобы в итоге я получил один набор данных для каждого продукта в каждом магазине. Например, если есть 3 продукта, а именно продукт 1, 2 и 3, и 2 магазина, A и B, я хочу иметь один набор данных, содержащий все данные продукта 1 в магазине A, а другой - все данные из продукта. 1 в магазине B и так далее.
Поскольку существует более 2500 продуктов, моей первой попыткой было попытаться автоматизировать с помощью цикла for или чего-то из семейства apply такой код:
library(dplyr)
product.n <- filter(train_dataset, product_id == n)
где n - это идентификатор продукта, который можно получить из другого выделенного набора данных. В этом случае идентификаторы продуктов являются переменными типа int. Предполагая, что я загрузил этот выделенный набор данных в качестве подсказок, я попробовал что-то вроде:
for (i in prods){
a = prods$product_id[i]
product.a <- paste("product", a)
product.a <- filter(train_dataset, product_id == a)
}
но это не сработало. Потом попробовал:
products <- split(train_dataset, f = train_dataset$product_id)
который работал. Он возвратил список различных списков, каждый из которых содержит все данные определенного идентификатора продукта. Затем, чтобы подмножество этих списков на основе идентификаторов магазинов, я увидел, что я не могу использовать код, структурированный таким же образом, потому что train_dataset $ store_id недоступно для добавления в параметр f функции разделения. Чтобы обойти это, я попытался использовать lapply:
products.per.store <- lapply(products, '[[', "store_id")
что не сработало.
Это привело к тому, что я попытался преобразовать все подсписки в фреймы данных, а затем попытался снова применить тот же процесс разделения, все автоматически. Это сработало для одного подсписка, который я сделал вручную, но я не смог автоматизировать его, я также не думаю, что это был бы эффективный способ сделать это. Я также думал об объединении filter и group by из dplyr, но, поскольку не смог автоматизировать первый пример кода, больше не пытался.
Вот заголовок из одного набора данных в шаблоне, к которому я стремлюсь (включающий только все данные из определенного идентификатора продукта в определенном идентификаторе магазина):
голова (prod41_store684023)
Week | Store_ID | Product_ID | Sales | Returns | Demand |
---|---|---|---|---|---|
3 | 684023 | 41 | 30 | 0 | 30 |
4 | 684023 | 41 | 95 | 0 | 95 |
5 | 684023 | 41 | 82 | 0 | 82 |
6 | 684023 | 41 | 30 | 0 | 30 |
7 | 684023 | 41 | 60 | 0 | 60 |
8 | 684023 | 41 | 70 | 0 | 70 |
Я видел довольно много других вопросов здесь, в SO, об операциях со списками в списках и о фильтрации / разделении / разделении наборов данных, но, к сожалению, не смог ничего экстраполировать на этот вопрос, поэтому я прошу прощения, если на него уже был дан ответ раньше.
Любая помощь будет оценена.
Спасибо!
P.S. Я добавлю сюда образец файла dput с данными из 2-х продуктов с идентификаторами 41 и 151:
Следуя подходу с использованием
library(dplyr)
product.n <- filter(train_dataset, product_id == n)
, мне удалось решить эту проблему.
dput
, а также две головы, одна из моих данных, а другая показывает набор данных в шаблоне, к которому я стремлюсь. - person Conor Neilson   schedule 25.03.2021