Как фильтровать списки в списке в R итеративно или как фильтровать data.table, используя два критерия одновременно, создавая объекты во время выполнения

Я работаю над таблицей 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)
, мне удалось решить эту проблему.


person Kíron Hashimoto    schedule 24.03.2021    source источник
comment
@ConorNeilson, я добавил образец своих данных, используя dput, а также две головы, одна из моих данных, а другая показывает набор данных в шаблоне, к которому я стремлюсь.   -  person Conor Neilson    schedule 25.03.2021
comment
структура (list (Week = c (3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L), Store_ID = c (684023L, 681747L, 685079L, 1623763L, 1035265L, 2482890L, 1546790L , 4586525L, 684023L, 1938075L, 681747L, 685079L, 1623763L, 2482890L, 1451516L, 4586525L, 2470338L, 684023L, 1938075L, 681747L, 1623763L, 2482890L, 2470338L, 1623763L, 1623763L, 2470338L, 1460238L, 1460172390, 1970338L, 1460238L, 146072390, 1970338L, 1460238L, 146072390L, 14607238L, 146072390, 1960318L , 2470338L, 1105804L, 2284385L, 146030L, 684023L, 681747L, 1623763L, 2482890L, 1546790L, 4586525L, 2470338L, 2284385L, 146030L, 684023L, 465617L, 681747L, 162372890L, 2481747L, 162379063L, 2481747L, 162374063L, 245617L, 681747L, 162379063L, 2481747L, 162374063L, 2481747L, 1623790L , 681747L, 1623763L, 2482890L, 1546790L, 64209L, 1451306L, 1451307L, 229054 1L, 153680L, 817983L, 1163986L, 1873535L, 4286560L, 4498110L, 153547L, 153688L, 153817L, 713342L, 1549943L, 161141L, 1044616L, 1072646L, 156859L, 113725L1624, 1468521L, 1137252L, 1137252L, 1137252L, 14619821 52677L, 167312L, 168521L, 168527L, 168678L, 1915817L, 1915818L, 168631L, 168784L, 434240L, 984120L, 2176784L, 64209L, 1451306L, 1451307L, 2290565L, 153680L, 81735983L, 153680L, 81735983, 153680L, 81735983 713342L, 1549943L, 161141L, 1044616L, 1072646L, 1856859L, 1137252L, 1469082L, 1951821L, 9716137L, 1963850L, 153840L, 1524199L, 1133031L, 168596L, 52677L, 1673128178L, 168721L, 167312842, 168596L, 1673L15842, 168596L, 1673L1581842 984120L, 2176784L, 2176785L, 64209L, 1451306L, 1451307L, 2290541L, 153680L, 817983L, 1163986L, 4286560L, 4498110L, 153547L, 153688L, 153817L, 713342L, 1541661390L, 1541161390L, 153817L, 713342L, 1541661390, 10602162, 713342L, 15411613850, 10162162 153840L, 1524199L, 168596L, 52677L, 167312L, 168521L, 1 68527L, 168678L, 1915817L, 1915818L, 168540L, 168631L, 168784L, 434240L, 984120L, 2176784L, 2176785L, 64209L, 1451306L, 1451307L, 2290541L, 153680L, 81798163L, 10381160L, 153680L, 81798163L, 42172344, 1161160L, 153680L, 81798163L, 4217839 1072646Л, 1856859Л, 1137252Л, 1469082Л, 9716137Л, 1963850Л, 153840Л, 168596Л, 52677Л, 167312Л, 168521Л, 168527Л, 168678Л, 1915817Л, 1915818Л, 168540Л, 168631Л, 1420540, 1487430, 168540Л, 168631Л, 1420540, 1487430, 168540Л, 168631Л 153680L, 817983L, 1163986L, 1873535L, 4286560L, 153688L, 153817L, 713342L, 1549943L, 161141L, 1044616L, 1072646L, 1856859L, 1137252L, 1469082L, 1951821L, 971627137L, 1696278L, 1696137L, 193821L, 9716278127 1915817Л, 1915818Л, 168540Л, 168631Л, 168784Л, 434240Л, 984120Л, 2176784Л, 64209Л, 1451306Л, 1451307Л, 2290541Л, 153680Л, 817983Л, 1163986Л, 1873535Л, 153680Л, 817983Л, 10358Л, 153864Л, 15388Л, 153864Л, 153864Л, 153864Л, 153864Л, 153864Л, 153864Л, 15388Л, 153864Л, 153864Л, 15388Л, 153864Л, 15388Л, 153864Л, 153864Л, 153864Л, 15388Л 1856859L, 1137252L, 1469082L, 1951821L, 9716137L, 1963850L, 153840Л, 1524199Л, 168596Л, 52677Л, 167312Л, 168521Л, 168527Л, 168678Л, 1915817Л, 1915818Л, 168540Л, 168631Л, 168784Л, 434240Л, 984120Л, 2176784Л, 2176785Л, 434240Л, 984120Л, 2176784Л, 2176785Л35130735Л, 1436209Л, 1436209Л, 1486785Л, 14130735, 1436209L, 1436209Л, 1436209Л 4286560L, 153547L, 153688L, 153817L, 713342L, 1549943L, 161141L, 1044616L, 1072646L, 1856859L, 1137252L, 1469082L, 1951821L, 9716137L, 1963885L, 153840L, 152420198L, 1667850L, 153840L, 152420195612L, 153840L, 152420195612L, 167308L 1915817L, 1915818L, 168540L, 168631L, 168784L, 434240L, 984120L, 2176784L, 2176785L), Product_ID = c (41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L , 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L , 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 151L, 151L, 151L , 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 1   -  person Kíron Hashimoto    schedule 25.03.2021


Ответы (1)


Как я уже сказал по вопросу, одна из моих попыток началась с:

который создал список с различными списками внутри, каждый из которых содержит все данные по определенному продукту.

products <- split(train_dataset, f = train_dataset$product_id)

Чтобы продолжить подмножество этих подсписок, мне пришлось использовать lapply с анонимной функцией:

он создал список со списками внутри, который, в свою очередь, также содержал списки внутри себя. Первый уровень подсписок включает один список для каждого идентификатора продукта, а второй уровень - один список для каждой комбинации идентификатора продукта с идентификаторами магазинов, что и было целью.

products_per_stores <- lapply(products, function(x){split(x, f = x$Store_ID)})

Это будет проще, если вы сможете поделиться образцом своих данных с помощью split

person Kíron Hashimoto    schedule 26.03.2021