Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据R中设置的限制分配值_R_While Loop_Dataframe - Fatal编程技术网

根据R中设置的限制分配值

根据R中设置的限制分配值,r,while-loop,dataframe,R,While Loop,Dataframe,我有一个商店列表,里面有一些不同的物品,还有一个仓库,里面有这些物品——这是两个独立的数据框 Article <- c('a','b','a','b','c','d') forecast <- c( 1,5,80,10,100,1000) StoreID <- c(1,1,2,2,3,4) StoreData <- data.frame(StoreID, Article, Order) 以及仓库数据: Stock <- c(10,11,12,100) Wareho

我有一个商店列表,里面有一些不同的物品,还有一个仓库,里面有这些物品——这是两个独立的数据框

Article <- c('a','b','a','b','c','d')
forecast <- c( 1,5,80,10,100,1000)
StoreID <- c(1,1,2,2,3,4)
StoreData <- data.frame(StoreID, Article, Order)
以及仓库数据:

Stock <- c(10,11,12,100)
WarehouseData <- data.frame(Article, Stock)

WarehouseData
Article Stock
a    10
b    11
c    12
d   100

任何人都能告诉我如何正确操作吗?

请参见下面的循环示例:

StoreData$PO <- NA
for (i in 1:nrow(StoreData)) {
  query <- WarehouseData$Article == StoreData[i, "Article"]
  po <- ifelse(StoreData[i, "forecast"] > WarehouseData[query, 2], 
               WarehouseData[query, 2],
               StoreData[i, "forecast"])

  WarehouseData[query, 2] <- WarehouseData[query, 2] - po
  StoreData[i, "PO"] <- po
}

print(StoreData)
# StoreID Article forecast  PO
# 1       1       a        1   1
# 2       1       b        5   5
# 3       2       a       80   9
# 4       2       b       10   6
# 5       3       c      100  12
# 6       4       d     1000 100

StoreData$PO下面是另一种使用
dplyr的方法:

library(dplyr)
left_join(storeData, WarehouseData, by = "Article") %>% 
  group_by(Article) %>% 
  mutate(PO = ifelse(cumsum(forecast) <= Stock, forecast, 
                     Stock - cumsum(forecast) + forecast)) %>% ungroup

#Source: local data frame [6 x 5]
#
#  StoreID Article forecast Stock    PO
#    (int)  (fctr)    (int) (dbl) (dbl)
#1       1       a        1    10     1
#2       1       b        5    11     5
#3       2       a       80    10     9
#4       2       b       10    11     6
#5       3       c      100    12    12
#6       4       d     1000   100   100
库(dplyr)
左联合(storeData,WarehouseData,by=“Article”)%>%
按(物品)分组%>%
突变(PO=ifelse(累计(预测)%解组
#来源:本地数据帧[6 x 5]
#
#StoreID商品预测库存采购订单
#(内部)(fctr)(内部)(dbl)(dbl)
#11101
#2 1 b 5 11 5
#3 2 a 80 10 9
#42B1106
#5 3 c 100 12
#6 4 d 1000 100

为什么a=1的第一次观测的
PO
(与预测相同)但是第一次观察到的c和d与
仓库数据
中的
库存
相同?您需要按顺序查看门店ID?例如,如果门店1的商品预测用完了所有可用库存,则门店2的订单将无法完成?@Sotos这正是问题所在-我必须批准此列中的预测umn如果仓库里有足够的数量。如果库存较少,我需要从仓库分配可用库存,而不是从仓库分配库存…好的,这会使sense@NBATrends你是对的,非常感谢。现在,我将尝试了解它是如何工作的:)
StoreData$PO <- NA
for (i in 1:nrow(StoreData)) {
  query <- WarehouseData$Article == StoreData[i, "Article"]
  po <- ifelse(StoreData[i, "forecast"] > WarehouseData[query, 2], 
               WarehouseData[query, 2],
               StoreData[i, "forecast"])

  WarehouseData[query, 2] <- WarehouseData[query, 2] - po
  StoreData[i, "PO"] <- po
}

print(StoreData)
# StoreID Article forecast  PO
# 1       1       a        1   1
# 2       1       b        5   5
# 3       2       a       80   9
# 4       2       b       10   6
# 5       3       c      100  12
# 6       4       d     1000 100
StoreData <- merge(StoreData, WarehouseData)
StoreData$PO <- do.call(c, lapply(split(StoreData, StoreData$Article), function(z) {
  ifelse(cumsum(z$forecast) <= z$Stock, z$forecast, 
         z$Stock - cumsum(z$forecast) + z$forecast) 
}))
StoreData <- read.table(text = "StoreID Article forecast
                        1       a        1
                        1       b        5
                        2       a       80
                        2       b       10
                        3       c      100
                        4       d     1000", header = T)


Article <- c('a','b','c','d')
Stock <- c(10,11,12,100)
WarehouseData <- data.frame(Article, Stock)
library(dplyr)
left_join(storeData, WarehouseData, by = "Article") %>% 
  group_by(Article) %>% 
  mutate(PO = ifelse(cumsum(forecast) <= Stock, forecast, 
                     Stock - cumsum(forecast) + forecast)) %>% ungroup

#Source: local data frame [6 x 5]
#
#  StoreID Article forecast Stock    PO
#    (int)  (fctr)    (int) (dbl) (dbl)
#1       1       a        1    10     1
#2       1       b        5    11     5
#3       2       a       80    10     9
#4       2       b       10    11     6
#5       3       c      100    12    12
#6       4       d     1000   100   100