这是我要解决的一个大问题。如果我有足够的声誉来奖励赏金,我会的!
希望平衡销售代表的帐户区域。我的流程被打破了,我真的不知道如何在每个地区进行。
在此示例中,有 1000 个帐户,跨 4 个区域,每个区域有 2 个子联盟,然后是帐户的不同所有者——有些帐户是无主的。每个帐户都有一个介于 1,000 和 100,000 之间的随机值。
可重现的例子:
账户列表:
set.seed(1)
Accounts <- paste0("Acc", 1:1000)
Region <- c("NorthEast", "SouthEast", "MidWest", "West")
League <- sample(c("Majors", "Minors"), 1000, replace = TRUE)
AccValue <- sample(1000:100000, 1000, replace = TRUE)
Owner <- sample(c("Chad", NA, "Jimmy", "Adrian", NA, NA, "Steph", "Matt", "Jared", "Eric"), 1000, replace = TRUE)
AccDF <- data.frame(Accounts, Region, League, AccValue, Owner)
AccDF$Accounts <- as.character(AccDF$Accounts)
AccDF$Region <- as.character(AccDF$Region)
AccDF$League <- as.character(AccDF$League)
AccDF$Owner <- as.character(AccDF$Owner)
区域所有权摘要:
Summary <- AccDF %>%
group_by(Region, League, Owner) %>%
summarise(Count = n(),
TotalValue = sum(AccValue))
按地区、联赛汇总:
Summary2 <- AccDF %>%
group_by(Region, League) %>%
summarise(Count = n(),
TotalValue = sum(AccValue),
AccountsPerRep = round(Count / 7, 0),
ValuePerRep = TotalValue / 7)
这就是所有的起始数据,我想对 Summary2 表的每个分组进行以下处理。
西部未成年人示例:
西部未成年人账户总数:120
#break out into owned and unowned
WestMinorsOwned <- AccDF %>%
filter(Region == "West",
League == "Minors",
!is.na(Owner))
WestMinorsUnowned <- AccDF %>%
filter(Region == "West",
League == "Minors",
is.na(Owner))
#unassign accounts until threshold is hit
New.WestMinors <- WestMinorsOwned %>%
mutate(r = runif(n())) %>%
arrange(r) %>%
group_by(Owner) %>%
mutate(NewOwner = replace(Owner, cumsum(AccValue) > 600000 | row_number() > 14, NA)) %>%
ungroup(Owner) %>%
mutate(Owner = NewOwner) %>%
select(-r, -NewOwner)
更新所有者后,我们将各个部分重新绑定在一起,以拥有 WestMinors 帐户库,所有这些都具有更新的所有者,希望是平衡的。
AssignableWestMinors <- bind_rows(filter(AccDF, Region == "West" & League == "Minors" & is.na(Owner)),
filter(New.WestMinors, is.na(Owner))) %>%
arrange(desc(AccValue))
#check work
OwnerSummary <- New.WestMinors %>%
filter(!is.na(Owner)) %>%
group_by(Region, League, Owner) %>%
summarise(Count = n(), TotalValue = sum(AccValue))
没有人拥有超过 14 个帐户或 600,000 个帐户,因此我们可以开始重新分配无主帐户以尝试平衡每个人。下面的 for 循环查看 OwnerSummary 中的每个名称,找出分配给他们的 $$ 最小的人并分配最有价值的帐户,然后遍历每个帐户,尝试平衡每个所有者的份额。
#Balance Unassigned
for (i in 1:nrow(AssignableWestMinors)){
idx <- which.min(OwnerSummary$TotalValue)
OwnerSummary$TotalValue[idx] <- OwnerSummary$TotalValue[idx] + AssignableWestMinors$AccValue[i]
OwnerSummary$Count[idx] <- OwnerSummary$Count[idx] + 1
AssignableWestMinors$Owner[i] <- as.character(OwnerSummary$Owner[idx])}
现在我们只需将之前拥有的和新分配的绑定在一起,我们就完成了平衡的 West Minors 领土。
WestMinors.Final <- bind_rows(filter(New.WestMinors, !is.na(Owner)), AssignableWestMinors)
WM.Summary <- WestMinors.Final %>%
group_by(Region, League, Owner) %>%
summarise(Count = n(),
TotalValue = sum(AccValue))
每个人的账户数量都差不多,总的 $$ 领土都在合理范围内。
现在,我正在尝试对原始 4 个地区、2 个联赛的每个分组进行此操作。所以这样做8次,然后把它们缝合在一起。每个子组都有不同的 $$ 价值阈值,以及帐户数量。如何将原始帐户基础拆分为 8 个部分,应用所有这些,然后将其重新组合在一起?