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