首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从表中合计组件产品

从表中合计组件产品
EN

Stack Overflow用户
提问于 2019-06-24 23:35:40
回答 3查看 54关注 0票数 0

我需要我的仓库能够知道我们每天需要多少个项目的每个组件。基本上,我已经捆绑了由单个产品组成的项目,我希望仓库知道在任何给定的日期他们应该提供多少单个项目。

我目前有这样的数据:

代码语言:javascript
复制
   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

我的预期输出是:

代码语言:javascript
复制
    date    all_item   total
06/01/2019     a         2
06/01/2019     b         3
07/01/2019     b         8

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

EN

回答 3

Stack Overflow用户

发布于 2019-06-24 23:49:26

像这样的东西是可以工作的(我以'a‘为例):

代码语言:javascript
复制
      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)
票数 0
EN

Stack Overflow用户

发布于 2019-06-24 23:51:43

我不会使用捆绑符号,它听起来太复杂了。如果所有内容都在行格式中,那么可以使用dplyr的group_by - summarize功能。

假设数据名为'df‘

代码语言:javascript
复制
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))
票数 0
EN

Stack Overflow用户

发布于 2019-06-25 12:22:17

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

我建议您从结构化数据库的角度来考虑这一点。在这种视图中,您的数据(以及您的世界)是由具有不同和互补信息的表组成的。当您需要获取信息来解决问题时,您可以对来自不同表的数据进行连接。如果你使用过excel,那么你就会知道它是vlookup

我会如何处理你的问题:

组件表:

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

对于您的示例,我将使用

代码语言:javascript
复制
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"))

这将产生以下结果:

代码语言:javascript
复制
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列的信息相同(顺便说一句,您的表名为"wide",而我的表名为"long“。Long对于机器处理来说要好得多,它被认为是“整洁的”)。

请求表

现在您已经有了一个用于组件的表,您将需要一个表来放置到y日期为止客户需要的产品x的单位数。您注意到了吗?我将两个表中的信息内容分开了。其中一个只有组件,没有其他;还有一个只有请求,没有其他。每一件东西都装在自己的篮子里!

这个表我称之为requests,它由三列组成:dates列表示请求日期,name列表示客户请求的产品名称,qty列表示客户对产品的期望数量。这将是您在数据的第一列到第三列中拥有的内容。

代码语言:javascript
复制
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"))

这会产生:

代码语言:javascript
复制
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包,有关详细信息,请参阅?data.table

代码语言:javascript
复制
requests[components, on = "name" ][, sum(qty*amount), by = .(dates, component)]

那里面是什么?

requests[components, on = "name"]通过匹配具有相同name的元素来将表requestscomponents联接。换句话说,它为requests中的每个name带来了componentamount (当然是来自组件)。粘贴命令并查看结果。

Data.table语法允许“链接”或将中间结果传递给新操作。这就是][序列所发生的事情:我连接了表,现在将结果输入到一个新的操作中。

这个新操作就是sum(qty * amount)。它将请求单元qty的数量乘以生成它所需的每个component的数量,并将其相加(聚合) by = .(dates, component),这看起来很不言自明。(如果您来自excel世界,只需考虑透视表或动态表)。

这将产生您预期的输出:

代码语言:javascript
复制
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

虽然结果与已经提供的其他答案相同,但我希望您能看到方法上的差异,以及此方法增强的可用性。如果不是,想象一下k_bundle是由19个不同的组件组成的 ;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56739874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档