我有一个数据框,其中每行的名称,我想划分成特定大小的箱,每个名称可以是多个不同的箱的一部分。但在最后的装箱每个名称只能使用一次。
name <- c("James", "Terry", "Fred", "Scottie", "Clint", "Gary", "Kevin", "Harrison", "Patrick")
available_bins <- c("A/B", "A/B", "B", "C/D", "E", "A/D", "A/D", "D/C", "D/C")
init <- data.frame(name,available_bins)
init
# name available_bins
#1 James A/B
#2 Terry A/B
#3 Fred B
#4 Scottie C/D
#5 Clint E
#6 Gary A/D
#7 Kevin A/D
#8 Harrison D/C
#9 Patrick D/C
每个bin具有特定大小,并存储在另一个 Dataframe 中。
bin_name <- c("A","B","C","D","E")
bin_size <- c(2,2,2,2,1)
binning_parameters <- data.frame(bin_name,bin_size)
binning_parameters
# bin_name bin_size
#1 A 2
#2 B 2
#3 C 2
#4 D 2
#5 E 1
每个人都应该被放进一个箱子里,而且总是会有足够的大小合适的箱子放进去。例如,在这里,您有9个人,4个大小为2的箱子,1个大小为1的箱子。有没有一种方法可以有效地做到这一点(同时考虑箱子大小)?没有必要只有一个正确答案,只是可以将所有姓名放入适当的箱子和大小。
示例结果:
final_bin <- c("A", "B", "B", "C", "E", "A", "D", "C", "D")
final_bin <- data.frame(name,final_bin)
final_bin
# name final_bin
#1 James A
#2 Terry B
#3 Fred B
#4 Scottie C
#5 Clint E
#6 Gary A
#7 Kevin D
#8 Harrison C
#9 Patrick D
我试过按一个箱子里最少的人排序,然后从集合中删除剩下的人,但可用箱子之间的重叠意味着有时我在每次迭代之间删除了错误的人。
1条答案
按热度按时间p1tboqfb1#
我没有找到"表格"方法(操作数据表,例如整洁样式),但这里有一个依赖于列表操作和{purrr}助手的递归解决方案:
x一个一个一个一个x一个一个二个x
has_bin
,属性has_bin
被设置为TRUE
,一旦该人员被给予箱:一个三个三个一个
collect_persons
,其(通过匹配箱字母)抓取每个箱的人,直到所有箱被填满或所有人已经被放置:输出: