Closed. This question needs to be more focused. It is not currently accepting answers. Learn more
想改进这个问题吗?更新问题,使其只关注一个问题editing this post
我经常教一个班,里面大约有160名学生。我需要尽可能有效地把评分论文还给学生我把文件分成一组四个大小差不多的箱子。我通常使用房间的四个角落来完成这项工作;每个角落一个垃圾箱,以减少交通问题,从而快速收回文件。
问题是知道如何尽可能同等地分割垃圾箱。这有点不同,因为姓氏的第一个字母的分布是1),在整个字母表中不一致,2),经验性分布在学期之间略有变化一个学期的一组容器可能是a-d、e-h、i-k和l-z,但每个学期的开始点和结束点可能会改变(当然,第一个容器中的a和最后一个容器中的z除外)。注意,例如,bin a-d将包括姓氏首字母为“a”、“b”、“c”和“d”的学生。不允许将字母顺序移动。
有人有一个关于如何使用R(我使用R为课堂上的其他东西和学生数据在R)的想法,以产生最有效的(即,同样大小)的开始和结束点的每四个箱每学期?
我认为使用“expand.grid”可能有助于生成所有可能的容器组合,并通过消除不正确的容器递归地向后工作。我考虑了一种严格的算法方法,它有一组嵌套循环,不仅可以构建各种bin组合,还可以使用累积和检查bin大小。我还认为这可能是lp求解器的整数规划/约束逻辑/背包程序的变体。
有什么想法吗?
谢谢

最佳答案

用这些名字奇怪的学生:

set.seed(123); who = apply(matrix(sample(letters,160*8,TRUE),ncol=8),1,paste0,sep‌​="",collapse="")

首先得到他们名字的第一个字母:
fl = substr(who,1,1)

第一个字母表的累计和:
cs = cumsum(table(fl))

看起来像这样:
> cs
  a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r   s   t
  3   8  15  25  29  35  44  48  56  62  71  79  86  89  95 100 105 114 118 123
  u   v   w   x   y   z
130 135 138 148 155 160

它告诉我们,第40个学生的字母顺序是从F开始,第80个学生的字母顺序是L,第120个学生的字母顺序是S。我们可以得到这样的结果:
> names(tail(which(cs <40) ,1))
[1] "f"
> names(tail(which(cs <80) ,1))
[1] "l"
> names(tail(which(cs <120) ,1))
[1] "s"

所以我们的报告堆被标记为a-f,g-l,m-s和t-z
将字母转换为数字,并将第一个字母向量切割为由这些间隔(再次转换为字母数字)定义的范围,这样我们就可以得到每个角落的学生人数:
> table(cut(as.numeric(factor(fl)),c(0,7,12,19,27)))

  (0,7]  (7,12] (12,19] (19,27]
     44      35      39      42

关于r - 在R中推导四个相等大小的学生文件箱,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45017603/

10-13 09:39