R循环:将记录分配给存在记录最少的类

R循环:将记录分配给存在记录最少的类,r,R,我有一组个人,我正在将项目分发给他们,以努力在个人之间实现总体项目的均匀分布 每个人只能接收特定的项目类型 项目的起始分布不相等 每种类型的可用项目数量是已知的,必须完全用尽 df包含人员数据的示例格式。请注意,Chuck总共有14件物品,而不是14只蝙蝠和14只手套 df<-data.frame(person=c("Chuck","Walter","Mickey","Vince","Walter","Mickey","Vince","Chuck"),alloweditem=c("bat"

我有一组个人,我正在将项目分发给他们,以努力在个人之间实现总体项目的均匀分布

每个人只能接收特定的项目类型

项目的起始分布不相等

每种类型的可用项目数量是已知的,必须完全用尽

df包含人员数据的示例格式。请注意,Chuck总共有14件物品,而不是14只蝙蝠和14只手套

df<-data.frame(person=c("Chuck","Walter","Mickey","Vince","Walter","Mickey","Vince","Chuck"),alloweditem=c("bat","bat","bat","bat","ball","ball","glove","glove"),startingtotalitemspossessed=c(14,9,7,12,9,7,12,14))
有没有最好的方法来编码这种形式的物品分发?我设想的步骤是:

检查可以接收给定项目的人员分配的项目总数最低。随意打破平局

将给定项目中的1项分配给此人

更新接收项目的人员的StartingTotalItemsAssessed

更新剩余要分配的项目编号

如果剩余总量为0,则停止给定项目的此循环,并移动到下一个项目。 下面是一个部分的表示,就像我想象的那样,它在循环中从左到右作为一个视图工作

注意:项目和人员数量非常多。如果可能的话,一种可以扩展到任何给定数量的人或物品的方法将是理想的


提前感谢您的帮助

我相信有更好的方法,但这里有一个例子:

df<-data.frame(person=c("Chuck","Walter","Mickey","Vince","Walter","Mickey","Vince","Chuck"),
    alloweditem=c("bat","bat","bat","bat","ball","ball","glove","glove"),
    total=c(14,9,7,12,9,7,12,14))
print(df)
##   person alloweditem total
## 1  Chuck         bat    14
## 2 Walter         bat     9
## 3 Mickey         bat     7
## 4  Vince         bat    12
## 5 Walter        ball     9
## 6 Mickey        ball     7
## 7  Vince       glove    12
## 8  Chuck       glove    14

otherdf<-data.frame(item=c("bat","ball","glove"),
    numberneedingassignment=c(3,4,7))

# Items in queue
queue <- rep(otherdf$item, otherdf$numberneedingassignment)

for (i in 1:length(queue)) {
  # Find person with the lowest starting total
    personToBeAssigned <- df[df$alloweditem == queue[i] & 
    df$total == min(df[df$alloweditem == queue[i], 3]), 1][1]
    df[df$person == personToBeAssigned & df$alloweditem == queue[i], 3] <- 
      df[df$person == personToBeAssigned & df$alloweditem == queue[i], 3] + 1
}

print(df)
##   person alloweditem total
## 1  Chuck         bat    14
## 2 Walter         bat    10
## 3 Mickey         bat     9
## 4  Vince         bat    12
## 5 Walter        ball    10
## 6 Mickey        ball    10
## 7  Vince       glove    17
## 8  Chuck       glove    16
似乎是相似的,但我不清楚如何调整以适应这个问题。
df<-data.frame(person=c("Chuck","Walter","Mickey","Vince","Walter","Mickey","Vince","Chuck"),
    alloweditem=c("bat","bat","bat","bat","ball","ball","glove","glove"),
    total=c(14,9,7,12,9,7,12,14))
print(df)
##   person alloweditem total
## 1  Chuck         bat    14
## 2 Walter         bat     9
## 3 Mickey         bat     7
## 4  Vince         bat    12
## 5 Walter        ball     9
## 6 Mickey        ball     7
## 7  Vince       glove    12
## 8  Chuck       glove    14

otherdf<-data.frame(item=c("bat","ball","glove"),
    numberneedingassignment=c(3,4,7))

# Items in queue
queue <- rep(otherdf$item, otherdf$numberneedingassignment)

for (i in 1:length(queue)) {
  # Find person with the lowest starting total
    personToBeAssigned <- df[df$alloweditem == queue[i] & 
    df$total == min(df[df$alloweditem == queue[i], 3]), 1][1]
    df[df$person == personToBeAssigned & df$alloweditem == queue[i], 3] <- 
      df[df$person == personToBeAssigned & df$alloweditem == queue[i], 3] + 1
}

print(df)
##   person alloweditem total
## 1  Chuck         bat    14
## 2 Walter         bat    10
## 3 Mickey         bat     9
## 4  Vince         bat    12
## 5 Walter        ball    10
## 6 Mickey        ball    10
## 7  Vince       glove    17
## 8  Chuck       glove    16