如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象

Posted

技术标签:

【中文标题】如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象【英文标题】:How to filter lists within a list in R iteratively or how to filter a data.table using two criteria simultaneously, creating objects at run time 【发布时间】:2021-06-21 14:51:39 【问题描述】:

我正在处理一个 data.table,其中包含除其他数据外,商业特许经营的某些商店对某些产品的需求。目标是预测每个商店对每种产品的需求。

这是我的数据集的“头”:

头部(训练数据集)

 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,我希望有一个数据集包含商店 A 上产品 1 的所有数据,另一个包含来自产品的所有数据1 在商店 B 上等等。

由于有超过 2500 种产品,我的第一次尝试是尝试使用循环 for 或 apply 系列中的某些东西来自动化这样的代码:

library(dplyr)
product.n <- filter(train_dataset, product_id == n)

其中“n”是可以从另一个专用数据集获取的产品 ID。在这种情况下,产品 ID 是 int 变量。假设我将这个专用数据集加载为“prods”,我尝试了类似的方法:

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)

这很有效。它返回一个包含各种列表的列表,每个列表都包含某个产品 ID 的所有数据。然后,要根据商店 ID 对该列表进行子集化,我发现我无法使用以相同方式构造的代码,因为“train_dataset$store_id”不能放在拆分函数的“f”参数上。为了解决这个问题,我尝试使用 lapply:

products.per.store <- lapply(products, '[[', "store_id")

这没用。

我尝试将所有子列表转换为数据框,然后尝试再次自动应用相同的拆分过程。它适用于我手动完成的单个子列表,但我无法自动化它,我也不认为这将是解决此问题的有效方法。我还考虑过将 dplyr 中的“过滤器”和“分组依据”结合起来,但由于无法自动化第一个代码示例,因此没有进一步尝试。

这是来自我所针对的模式中的一个数据集的“头部”(仅包括来自某个商店 id 中某个产品 id 的所有数据):

头部(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 中看到了很多其他关于列表中列表的操作以及关于过滤/拆分/子集数据集的其他问题,但不幸的是,无法推断出这个问题的任何内容,所以如果这个问题已经得到解答,我深表歉意之前。

任何帮助将不胜感激。

谢谢!

附:我将在此处添加一个示例 dput 文件,其中包含来自 2 个产品 ID、ID 41 和 151 的数据:

结构(列表(周= 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, 146030L, 684023L、1938075L、465617L、681747L、1623763L、2482890L、1546790L、 4586525L, 2470338L, 1105804L, 2284385L, 146030L, 684023L, 681747L, 1623763L, 2482890L, 1546790L, 4586525L, 2470338L, 2284385L, 146030L, 684023L、465617L、681747L、1623763L、2482890L、1546790L、4586525L、 2470338L, 2284385L, 146030L, 684023L, 1938075L, 681747L, 1623763L, 2482890L, 1546790L, 64209L, 1451306L, 1451307L, 2290541L, 153680L, 817983L、1163986L、1873535L、4286560L、4498110L、153547L、153688L、 153817L, 713342L, 1549943L, 161141L, 1044616L, 1072646L, 1856859L, 1137252L, 1469082L, 1951821L, 9716137L, 1963850L, 153840L, 1524199L, 1133031L, 168596L, 52677L, 167312L, 168521L, 168527L, 168678L, 1915817L, 1915818L, 168631L, 168784L, 434240L, 984120L, 2176784L, 64209L、1451306L、1451307L、2290541L、153680L、817983L、1163986L、 1873535L, 4286560L, 4498110L, 153547L, 153688L, 153817L, 713342L, 1549943L, 161141L, 1044616L, 1072646L, 1856859L, 1137252L, 1469082L, 1951821L, 9716137L, 1963850L, 153840L, 1524199L, 1133031L, 168596L, 52677L、167312L、168521L、168527L、168678L、1915817L、1915818L、 168631L、168784L、434240L、984120L、2176784L、2176785L、64209L、 1451306L, 1451307L, 2290541L, 153680L, 817983L, 1163986L, 4286560L, 4498110L, 153547L, 153688L, 153817L, 713342L, 1549943L, 161141L, 1044616L, 1072646L, 1856859L, 1137252L, 1469082L, 9716137L, 1963850L, 153840L, 1524199L, 168596L, 52677L, 167312L, 168521L, 168527L, 168678L, 1915817L, 1915818L, 168540L, 168631L, 168784L, 434240L, 984120L、2176784L、2176785L、64209L、1451306L、1451307L、2290541L、 153680L、817983L、1163986L、4286560L、153688L、153817L、713342L、 1549943L, 161141L, 1044616L, 1072646L, 1856859L, 1137252L, 1469082L, 9716137L, 1963850L, 153840L, 168596L, 52677L, 167312L, 168521L, 168527L, 168678L, 1915817L, 1915818L, 168540L, 168631L, 168784L, 434240L、984120L、2176784L、64209L、1451306L、1451307L、2290541L、 153680L、817983L、1163986L、1873535L、4286560L、153688L、153817L、 713342L, 1549943L, 161141L, 1044616L, 1072646L, 1856859L, 1137252L, 1469082L, 1951821L, 9716137L, 1963850L, 153840L, 168596L, 52677L, 167312L、168521L、168527L、168678L、1915817L、1915818L、168540L、 168631L、168784L、434240L、984120L、2176784L、64209L、1451306L、 1451307L, 2290541L, 153680L, 817983L, 1163986L, 1873535L, 4286560L, 153547L、153688L、153817L、713342L、1549943L、161141L、1044616L、 1072646L, 1856859L, 1137252L, 1469082L, 1951821L, 9716137L, 1963850L, 153840L, 1524199L, 168596L, 52677L, 167312L, 168521L, 168527L, 168678L, 1915817L, 1915818L, 168540L, 168631L, 168784L, 434240L, 984120L、2176784L、2176785L、64209L、1451306L、1451307L、2290541L、 153680L、817983L、1163986L、1873535L、4286560L、153547L、153688L、 153817L, 713342L, 1549943L, 161141L, 1044616L, 1072646L, 1856859L, 1137252L, 1469082L, 1951821L, 9716137L, 1963850L, 153840L, 1524199L, 4722056L, 1133031L, 168596L, 52677L, 167312L, 168521L, 168527L, 168678L, 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, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L, 151L), 销售额 = c(30L, 2064L, 0L, 1022L, 0L, 330L、200L、20L、95L、105L、1430L、0L、740L、430L、5L、7L、45L、 82L、20L、1686L、820L、400L、25L、70L、30L、40L、0L、1250L、986L、 500L、80L、1L、25L、138L、200L、60L、60L、1570L、1030L、300L、 50L、10L、20L、100L、40L、70L、30L、1305L、1159L、295L、60L、 20L、10L、110L、65L、45L、70L、1378L、1269L、410L、40L、12L、 14L, 7L, 15L, 10L, 15L, 23L, 9L, 18L, 3L, 10L, 13L, 21L, 12L, 17L、72L、20L、9L、16L、25L、12L、1L、10L、25L、11L、9L、12L、 10L, 14L, 20L, 10L, 18L, 11L, 10L, 10L, 3L, 16L, 3L, 5L, 6L, 14L、8L、5L、13L、5L、13L、7L、6L、11L、1L、3L、19L、15L、13L、 13L、38L、27L、11L、14L、13L、6L、3L、14L、10L、8L、3L、14L、 11L, 12L, 18L, 14L, 24L, 12L, 5L, 10L, 3L, 22L, 24L, 10L, 4L, 8L、19L、23L、4L、10L、7L、17L、27L、9L、4L、4L、12L、17L、16L、 18L, 32L, 9L, 1L, 16L, 29L, 5L, 22L, 10L, 11L, 6L, 5L, 8L, 28L, 11L, 22L, 10L, 10L, 25L, 18L, 8L, 20L, 18L, 25L, 8L, 16L, 16L, 8L、5L、6L、7L、17L、19L、22L、18L、20L、21L、20L、55L、14L、 4L、16L、7L、3L、16L、17L、15L、15L、16L、24L、16L、20L、17L、 14L, 15L, 6L, 6L, 14L, 19L, 31L, 10L, 15L, 15L, 6L, 7L, 2L, 11L, 18L, 4L, 9L, 13L, 7L, 2L, 8L, 9L, 17L, 2L, 20L, 6L, 10L, 6L, 8L, 20L, 3L, 6L, 16L, 18L, 20L, 28L, 5L, 11L, 10L, 5L, 3L, 17L, 11L、10L、2L、16L、9L、8L、7L、21L、43L、44L、13L、20L、21L、 21L、26L、29L、60L、38L、12L、5L、16L、9L、10L、3L、10L、9L、 8L, 7L, 18L, 15L, 15L, 20L, 40L, 16L, 20L, 15L, 21L, 6L, 10L, 26L、14L、8L、9L、25L、14L、15L、20L、6L、10L、15L、14L、19L、 3L、22L、21L、14L、8L、122L、43L、8L、9L、39L、18L、2L、16L、 23L、18L、18L、1L、29L、17L、30L、42L、18L、55L、12L、20L、15L、 16L, 11L, 12L, 21L, 20L, 13L, 16L),返回 = c(0L, 0L, 9L, 0L, 90L, 0L, 0L, 5L, 0L, 0L, 0L, 20L, 0L, 0L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 30L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 70L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 需求 = c(30L, 2064L, 0L, 1022L, 0L, 330L, 200L, 15L, 95L, 105L, 1430L, 0L, 740L、430L、5L、4L、45L、82L、20L、1686L、820L、400L、25L、70L、 30L、40L、0L、1250L、986L、500L、80L、1L、25L、138L、200L、60L、 60L、1570L、1030L、300L、50L、10L、20L、100L、40L、70L、0L、1305L、 1159L、295L、60L、20L、10L、110L、65L、45L、70L、1378L、1269L、 410L, 40L, 12L, 14L, 7L, 15L, 10L, 15L, 23L, 9L, 18L, 3L, 10L, 13L、21L、12L、17L、72L、20L、9L、16L、25L、12L、1L、10L、25L、 11L, 9L, 12L, 10L, 14L, 20L, 10L, 18L, 11L, 10L, 10L, 3L, 16L, 3L, 5L, 6L, 14L, 8L, 5L, 13L, 5L, 13L, 7L, 6L, 11L, 1L, 3L, 19L, 15L, 13L, 13L, 38L, 27L, 11L, 14L, 13L, 6L, 3L, 14L, 10L, 8L, 3L, 14L, 11L, 12L, 18L, 14L, 24L, 12L, 5L, 10L, 3L, 22L, 24L, 10L、4L、8L、19L、23L、4L、10L、7L、17L、27L、9L、4L、4L、12L、 17L、16L、18L、32L、9L、1L、16L、29L、5L、22L、10L、11L、6L、 5L、8L、28L、11L、22L、10L、10L、25L、18L、8L、20L、18L、25L、 8L、16L、16L、8L、5L、6L、7L、17L、19L、22L、18L、20L、21L、20L、 55L, 14L, 4L, 16L, 7L, 3L, 16L, 17L, 15L, 15L, 16L, 24L, 16L, 20L, 17L, 14L, 15L, 6L, 6L, 14L, 19L, 31L, 10L, 15L, 15L, 6L, 7L, 2L, 11L, 18L, 4L, 9L, 13L, 7L, 2L, 8L, 9L, 17L, 2L, 20L, 6L, 10L, 6L, 8L, 20L, 3L, 6L, 16L, 18L, 20L, 28L, 5L, 11L, 10L, 5L、3L、17L、11L、10L、2L、16L、9L、8L、7L、21L、43L、44L、13L、 20L, 21L, 21L, 26L, 29L, 60L, 38L, 12L, 5L, 16L, 9L, 10L, 3L, 10L, 9L, 8L, 7L, 18L, 15L, 15L, 20L, 40L, 16L, 20L, 15L, 21L, 6L, 10L, 26L, 14L, 8L, 9L, 25L, 14L, 15L, 20L, 6L, 10L, 15L, 14L、19L、3L、22L、21L、14L、8L、122L、43L、8L、9L、39L、18L、 2L, 16L, 23L, 18L, 18L, 1L, 29L, 17L, 30L, 42L, 18L, 55L, 12L, 20L, 15L, 16L, 11L, 12L, 21L, 20L, 13L, 16L)), row.names = c(NA, -335L), class= c("data.table", "data.frame"), .internal.selfref = )

【问题讨论】:

如果您可以使用dput分享您的数据样本,这将更容易 @ConorNeilson,我已经使用dput 添加了我的数据样本以及两个“头”,一个是我的数据,另一个显示了我正在瞄准的模式中的数据集在。 【参考方案1】:

跟进使用split 的方法,我设法解决了这个问题。

就像我在这个问题上所说的那样,我的一个尝试是这样开始的:

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

它创建了一个列表,其中包含各种列表,每个列表都包含来自某个产品的所有数据。

为了进一步子集这个子列表,我使用 lapply 和匿名函数:

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

它创建了一个列表,其中包含列表,而列表中也包含列表。子列表的“第一级”包括每个产品 id 一个列表和“第二级”,每个产品 id 与商店 id 的组合一个列表,这就是目标。

【讨论】:

以上是关于如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中的单个数据帧上迭代地应用函数?

如何有效地过滤 SwiftUI 中的长列表?

从 java 8 流中的列表中过滤值

在比较列表中的元素时,如何有效地迭代并提高 O(n^2) 的时间复杂度?

如何迭代地将 2 个列表中的元素应用到新函数中? [复制]

如何使用 MVC 模型动态过滤 javafx 中的列表视图控件,同时以多种方式更新? [关闭]