【问题标题】:Choose from options based on values from previous rows [closed]根据前几行的值从选项中进行选择[关闭]
【发布时间】:2017-07-04 13:57:45
【问题描述】:

** 该数据是 3 个商店的 20 个订单的样本数据。尝试编写一个算法来根据规则确定哪个商店将满足哪个订单 **

如果有超过 1 个商店符合订单条件,则累计满足订单数量最少的商店将满足当前订单。 例如,如果 S1、S2 和 S3 在订单 #3 之前已经满足了 100、150、75 个单位的订单,并且 S1 和 S2 有资格获得订单 #4,那么 S1 将满足订单 #4

OrderNum|OrderQty|StoresEligible
------- |--------|--------------
1|12|S3
2|10|S1
3|19|S1,S2
4|7|S1,S2
5|14|S1,S2,S3
6|19|S2
7|5|S1,S2
8|17|S2
9|13|S3
10|5|S1

实际上,美国有 2,000 家商店和 100 万个订单

【问题讨论】:

  • 你试过什么?什么不工作?
  • 我不知道如何处理这个问题。我首先获取每行的每个商店的计数并将它们存储在单独的表中,然后通过 OrderNum 运行循环以识别第 (i+1) 行的数字较少的商店。这个逻辑听起来很有趣,但我发现它很难编码。
  • 最好知道哪个商店实际交付了每个订单。因为如果你没有这个变量,你将不得不在每个新订单上迭代地重新计算整个历史......
  • 是的,这正是我想要计算的。哪个商店要送货。对于订单 1 S3 是显而易见的选择,对于 2 S1 是选择。但是对于 3,S1 和 S2 都可以交付,但 S2 应该交付,因为 S2 交付的数量少于 S1,依此类推。所以我最终试图提出一个列,当有多个选项时,只有实际交付订单的商店
  • 你能解释一下选择标准,这样更容易理解吗?

标签: sql r sas sas-macro


【解决方案1】:

好的,这解决了您的部分问题,这是一个向您的数据添加新行的功能,将过去的数据(我添加了 ChoosenStore 信息)、数量和符合条件的商店作为输入;它输出完成N+1顺序的data.frame:

您必须将此函数迭代地应用于您过去的数据才能完成它。

library(dplyr); library(tidyr)
# initialise the data.frame with just the first 3 lines
df=data.frame(OrderNum=1:3, OrderQty=c(12,10,19),
              StoresEligible=c("S3", "S1", "S1, S2"), 
              ChoosenStore=c("S3", "S1", "S2"),stringsAsFactors=FALSE)
# function to compute new incoming order
NewOrder = function(df, quantity, eligible){
  choosen <- df %>% filter(ChoosenStore %in% eligible) %>%
    group_by(ChoosenStore) %>% 
    summarise(CumQty=sum(OrderQty)) %>%
    top_n(-1, CumQty) %>% .$ChoosenStore
  return(rbind(df, c(tail(df$OrderNum, 1)+1,
                     quantity,
                     paste0(eligible, collapse=", "),
                     choosen)))}
# try it with the 4th line
NewOrder(df, 7, c("S1", "S2"))

【讨论】:

  • 非常感谢agenis。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2021-03-04
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多