我需要我的仓库能够知道我们每天需要多少个项目的每个组件。基本上,我已经捆绑了由单个产品组成的项目,我希望仓库知道在任何给定的日期他们应该提供多少单个项目。
我目前有这样的数据:
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列可以包含捆绑项或单个项,因此它是混合的。
发布于 2019-06-24 23:49:26
像这样的东西是可以工作的(我以'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)发布于 2019-06-24 23:51:43
我不会使用捆绑符号,它听起来太复杂了。如果所有内容都在行格式中,那么可以使用dplyr的group_by - summarize功能。
假设数据名为'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))发布于 2019-06-25 12:22:17
我评论说你需要一个更好的方法来解决这个问题。
我建议您从结构化数据库的角度来考虑这一点。在这种视图中,您的数据(以及您的世界)是由具有不同和互补信息的表组成的。当您需要获取信息来解决问题时,您可以对来自不同表的数据进行连接。如果你使用过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列的信息相同(顺便说一句,您的表名为"wide",而我的表名为"long“。Long对于机器处理来说要好得多,它被认为是“整洁的”)。
请求表
现在您已经有了一个用于组件的表,您将需要一个表来放置到y日期为止客户需要的产品x的单位数。您注意到了吗?我将两个表中的信息内容分开了。其中一个只有组件,没有其他;还有一个只有请求,没有其他。每一件东西都装在自己的篮子里!
这个表我称之为requests,它由三列组成:dates列表示请求日期,name列表示客户请求的产品名称,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"))这会产生:
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。
requests[components, on = "name" ][, sum(qty*amount), by = .(dates, component)]那里面是什么?
requests[components, on = "name"]通过匹配具有相同name的元素来将表requests与components联接。换句话说,它为requests中的每个name带来了component和amount (当然是来自组件)。粘贴命令并查看结果。
Data.table语法允许“链接”或将中间结果传递给新操作。这就是][序列所发生的事情:我连接了表,现在将结果输入到一个新的操作中。
这个新操作就是sum(qty * amount)。它将请求单元qty的数量乘以生成它所需的每个component的数量,并将其相加(聚合) by = .(dates, component),这看起来很不言自明。(如果您来自excel世界,只需考虑透视表或动态表)。
这将产生您预期的输出:
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个不同的组件组成的 ;)
https://stackoverflow.com/questions/56739874
复制相似问题