汇总表中的组件产品

时间:2019-06-24 15:35:39

标签: r aggregate

我需要我的仓库能够知道我们每天需要多少个每个组件。基本上,我捆绑了由单一产品制成的物品,我希望仓库知道在任何给定日期应提供多少这些单一物品。

我目前有这样的数据:

   date      bundle_name  totbund   prod1  totprod1  prod2  totprod2  
06/01/2019      a_bund       1        a       1        b       1
06/01/2019        a          1
06/01/2019        b          2
07/01/2019      b_bund       1        b       2
07/01/2019      b_bund       2        b       4
07/01/2019        b          2

我的预期的输出是这样的:

    date    all_item   total
06/01/2019     a         2
06/01/2019     b         3
07/01/2019     b         8

请注意,bundle_item列中可以包含捆绑商品或单个商品,因此它是混合商品。

3 个答案:

答案 0 :(得分:0)

类似的事情可能起作用(我以“ a”为例):

      dat = dat %>%
        group_by(date) %>%
        summarize(a_bund = sum(tot_bund[bundle_name=='a']),
                  a_prod1 = sum(prod1[totprod1=='a']),
                  a_prod2 = sum(prod2[totprod2=='a'])) %>%
        mutate(a = a_bund+a_prod1+a_prod2)

答案 1 :(得分:0)

我不会使用捆绑符号,这听起来过于复杂。如果所有内容都以行格式显示,则可以使用group_by-dplyr的摘要功能。

假设数据称为“ df”

library(dplyr)

df <- df %>% 
  select(date, prod = prod1, totprod = totprod1) %>%
  filter(prod != "") %>%
  bind_rows(df %>% select(date, prod = prod2, totprod = totprod2) %>% filter(prod != "") %>%
  group_by(date, prod) %>%
  summarize(totprod = sum(totprod))

答案 2 :(得分:0)

我评论说您需要一个更好的方法来解决这个问题。

我建议您从结构化数据库的角度考虑这一点。在这种情况下,您的数据(进而是您的世界)是由具有不同且互补信息的表组成的。而且,当您需要获取信息来解决问题时,您可以加入来自不同表的数据。如果您使用过excel,则将其称为vlookup

我如何解决您的问题:

组件表:

首先,我将有一个组件表。这将是一个非常简单的表,由3列组成:产品的name,制造产品的component和所需的组件amount

以您的示例为例,

library(data.table)

components <- structure(list(name = c("a", "b", "a_bund", "a_bund", "b_bund"), 
                             component = c("a", "b", "a", "b", "b"),
                             amount = c(1, 1, 1, 1, 2)), 
                        row.names = c(NA, -5L), 
                        class = c("data.table", "data.frame"))

哪个会产生:

components
     name component amount
1:      a         a      1
2:      b         b      1
3: a_bund         a      1
4: a_bund         b      1
5: b_bund         b      2

请注意,此处包含的信息与表中第4至7列中的信息完全相同(顺便说一句,您的表被称为“宽”,而我的格式为“长”)。长更好用于机器处理,并且被认为是“整洁的”)。

请求表

现在您已经有了一个组件表,您将需要一个表来放入客户在 y 日期之前需要多少个产品 x 的信息。您是否注意到我将两个表中的信息内容分开了?有一个组件,没有其他。有一个请求,没有其他。每个东西都放在自己的篮子里!

此表我称为requests,它由三列组成:带有请求日期的dates,带有客户请求的产品名称的name和{{ 1}}和客户期望的产品数量。那就是数据第一到第三栏中的内容。

qty

哪个会产生:

requests <- structure(list(dates = structure(c(17902, 17902, 17902, 17903, 17903, 17903), class = "Date"), 
                           name = c("a_bund", "a", "b", "b_bund", "b_bund", "b"), 
                           qty = c(1, 1, 2, 1, 2, 2)), 
                      row.names = c(NA, -6L), 
                      class = c("data.table", "data.frame"))

加入表格

使用这两个表,您现在需要知道在任何给定日期需要多少个每个组件。为解决此问题,我将使用data.table包,有关详细信息,请参见requests dates name qty 1: 2019-01-06 a_bund 1 2: 2019-01-06 a 1 3: 2019-01-06 b 2 4: 2019-01-07 b_bund 1 5: 2019-01-07 b_bund 2 6: 2019-01-07 b 2

?data.table

里面有什么?

requests[components, on = "name" ][, sum(qty*amount), by = .(dates, component)] 通过匹配具有相同requests[components, on = "name"]的元素,将表requestscomponents连接起来。换句话说,它为name中的每个component带来了amountname(当然来自组件)。粘贴命令,看看结果如何。

Data.table语法允许“链接”或将中间结果传递给新操作。 requests序列就是这样:我加入了表格,现在将结果输入新的操作中。

该新操作为][。它是将请求的单位sum(qty * amount)的数量乘以(最初您没错),将其生成所需的每个qty的数量,然后将其相加(汇总)component,从而得出似乎很不言自明。 (如果您来自excel世界,那就考虑一下数据透视表或动态表)。

这将产生您的预期输出:

by = .(dates, component)

虽然结果与已经提供的其他答案相同,但我希望您看到方法的差异以及此方法的增强的可用性。如果不是,请想象requests[components, on = "name" ][, sum(qty*amount), by = .(dates, component)] dates component V1 1: 2019-01-06 a 2 2: 2019-01-06 b 3 3: 2019-01-07 b 8 19个不同的组件;)