根据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