0

这是我的旧问题的延续根据现有列的条件创建新列 我有一个与以前类似的情况,但现在我在输入中有一个附加列,在输出中有 3 个附加列 - 以及 6 个要检查的条件

数据集现在是这样的

structure(list(Item = c("P_6000_1", "P_6000_1", "P_6000_1", "P_6000_3", 
                    "P_6000_3", "P_6000_3", "P_6000_5", "P_6000_5", "P_6000_5"), 
           Customer = c("Customer_4", "Customer_4", "Customer_4", "Customer_4", 
                        "Customer_4", "Customer_4", "Customer_1", "Customer_1", "Customer_1"), 
           DemandID = c("Order_175", "Order_176", "Order_177", "Order_186", 
                           "Order_187", "Order_188", "Order_195", "Order_196", "Order_197"),
           Order = c(450L, 479L, 365L, 2890L, 3450L, 2500L, 234L, 443L, 321L), 
           Forecast = c(3300L, 3300L, 3300L, 3846L, 3846L, 3846L, 3070L, 3070L, 3070L), 
           RTF = c(3113L, 3113L, 3113L, 0L, 0L, 0L, 3200L, 3200L, 3200L)), 
      row.names = c(NA, -9L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x00000000025c1ef0>)

我有 2 个新列 DemandID 和 Order

对于每个 Item、Customer 组合,只有一个 Forecast 和 RTF 值 - 重复它们以填满行

我对新列的条件是

1. Forecast < Order < RTF -> COM_O = Forecast, NEW_O = Order - Forecast, UNF_O = 0, COM_F = 0, NEW_F = 0

2. Forecast < RTF < Order -> COM_O = Forecast, NEW_O = RTF - Forecast, UNF_O = Order - RTF, COM_F = 0, NEW_F = 0
    
3. RTF < Order < Forecast -> COM_O = RTF, NEW_O = Order - RTF, UNF_O = 0, COM_F = 0, NEW_F = Forecast - Order, 

4. RTF < Forecast < Order -> COM_O = RTF, NEW_O = Forecast - RTF, UNF_O = Order - Forecast, COM_F = 0, NEW_F = 0

5. Order < Forecast < RTF -> COM_Order = Order, NEW_Order = 0, UNF_Order = 0, COM_FCST = Forecast - Order, NEW_FCST = 0

6. Order < RTF < Forecast -> COM_Order = Order, NEW_Order = 0, UNF_Order = 0, COM_Forecast = RTF - Order, NEW_Fcst = Forecast - RTF

我知道我可以通过使用获取项目客户组合的预测和 RTF

cols = c('Item','Customer')
tempDT <- dt[, ItemCust := (paste0(unlist(.SD), collapse="")), .SDcols= cols,     by=.(row=seq_len(nrow(dt)))]
tempDT1 = tempDT[,.(ItemCust, Forecast, RTF)]
tempDT1 <- tempDT1[, .(Forecast = mean(Forecast), RTF = mean(RTF)), by = .(ItemCust)]

但在这之后我被困住了。

我的问题是我如何循环遍历每个项目的需求 ID - 客户组合并使用上述条件。在根据 demandid 行生成新列之后,还应更新 RTF 和预测值

编辑:添加输入和预期输出

input = data.frame(Item = c("P_6000_1", "P_6000_1", "P_6000_1"), 
              Customer = c("Customer_4", "Customer_4", "Customer_4"), 
              DemandID = c("Order_175", "Order_176", "Order_177"),
              Order = c(450L, 479L, 365L), 
              Forecast = c(3300L, 3300L, 3300L), 
              RTF = c(3113L, 3113L, 3113L)) 

output1 = data.frame(Item = c("P_6000_1", "P_6000_1", "P_6000_1"), 
                Customer = c("Customer_4", "Customer_4", "Customer_4"), 
                DemandID = c("Order_175", "Order_176", "Order_177"),
                Order = c(450L, 479L, 365L), 
                COM_O = c(450, 479, 365)) 

output2 = data.frame(Item = c("P_6000_1"), 
                 Customer = c("Customer_4"),
                 Forecast = c(2006),
                 RTF = c(1819))

输出 2 可以来自我创建的 tempDT1。这是减去订单后从预测和 rtf 中剩余的任何内容。在这个数据表上,我将在 Order = 0 的基础上运行最后两个条件的查询

tempDT1[, c("New_F","Com_F") := 
          .(fifelse(Forecasts > RTF, Forecasts - RTF, 0), 
            fifelse(Forecasts > RTF, RTF, Forecasts))] 

并获取 New_F 和 Com_F 所需的列,然后根据 Item 和 Customer 重新连接表。

4

1 回答 1

1

我尝试了几种规格。我认为下面的过程产生的输出最有可能是您想要的输出。

dt[, 
   .(Order = sum(Order)),
   by = .(Item, Customer, Forecast, RTF)
][,
  COM_O := pmin(Forecast, RTF, Order)
][, `:=`(
  NEW_O = pmin(Order, pmax(Forecast, RTF)) - COM_O,
  UNF_O = pmax(Order - pmax(Forecast, RTF), 0), 
  COM_F = pmax(pmin(Forecast, RTF) - Order, 0), 
  NEW_F = pmax(Forecast - pmax(Order, RTF), 0), 
  Forecast = Forecast - COM_O, 
  RTF = RTF - COM_O
)]

输出

       Item   Customer Forecast  RTF Order COM_O NEW_O UNF_O COM_F NEW_F
1: P_6000_1 Customer_4     2006 1819  1294  1294     0     0  1819   187
2: P_6000_3 Customer_4     3846    0  8840     0  3846  4994     0     0
3: P_6000_5 Customer_1     2072 2202   998   998     0     0  2072     0
于 2020-11-27T11:44:42.560 回答