我想为我的教室创建一个列表,每个可能的4个学生的组。如果我有20个学生,我如何创建这个,按组,在R中,我的行是每个组合,有20列学生ID的完整列表,列1 - 4是"组1",5 - 9是"组2"等。
下面列出了每一组4名学生(x1、x2、x3和x4)的可能组合。现在,对于列出的每一行,其他4组4名学生的可能组合是什么?因此,应该有20列(Group1_1:4、Group2_1:4、Group3_1:4、Group4_1:4、Group5_1:4)。
combn(c(1:20), m = 4)
预期输出
Combination 1 = Group1[1, 2, 3, 4] Group2[5, 6, 7, 8], Group3[9, 10, 11, 12], etc.
Combination 2 = Group1[1, 2, 3, 5]... etc.
有很多关于组合的帖子在那里,这可能是已经回答了,我只是找不到它。任何帮助是赞赏!
8条答案
按热度按时间uyhoqukh1#
您可以使用**
RcppAlgos (v >= 2.3.5)
***中的comboGroups
。或者,如果您更喜欢矩阵:
它的速度也非常快,你甚至可以用
nThreads
或Parallel = TRUE
(后者使用1减去系统最大线程数)并行生成,以获得更高的效率:一个非常好的特性是能够生成样本或特定的词典编纂组合组,特别是当结果数量很大时。
最后,使用
lower
和upper
参数,可以在一分钟内生成所有**2,546,168,625
**组合,将20人的组分为5个组(OP要求的):虽然我开始研究这个问题over a year ago,但是这个问题给了我很大的启发,使我能够在一个包中将其形式化。
RcppAlgos
**的作者jgovgodb2#
这在很大程度上依赖于以下答案:
可以创建所有组合和这些组合的所有组的算法
需要注意的是,答案并不是动态的--它只包含了一个针对3个组的解决方案。为了使它更健壮,我们可以基于输入参数创建代码。也就是说,下面的递归函数是针对3个组动态创建的:
运行
N = 16
和k = 4
大约需要55秒。我想把它翻译成Rcpp
,但不幸的是我没有这个技能。业绩
jvlzgdj93#
这是一个具有计算挑战性的问题,因为我相信有25亿种可能性需要枚举(如果这是错误的,我欢迎任何关于这种方法哪里出错的见解)。
根据存储方式的不同,包含所有这些分组的表可能需要比大多数计算机所能处理的更多的RAM。如果能看到一种高效的方法来创建它,我会印象深刻。如果我们采取“一次创建一个组合”的方法,如果我们每秒能生成100万个组合,那么生成所有可能性仍然需要41分钟,如果我们只能生成1个组合,那么生成所有可能性需要一个月。000次/秒。
EDIT -在底部添加了部分实现,以创建从#1到#2,546,168,625的任何所需分组。出于某些目的,这几乎与实际存储整个序列一样好,因为整个序列非常大。
假设我们将分成5组,每组4名学生:A组、B组、C组、D组和E组。
我们将1号学生所在的组定义为A组,他们可以与其他19名学生中的任意3名配对,我相信其他学生的这种组合有969种:
现在还有16个学生可以分到其他组,我们把第一个不在A组的学生分到B组,可能是2号、3号、4号、5号,都没关系;我们只需要知道只有15个学生可以和那个学生配对。2这样的组合有455个:
现在还剩12个学生,我们再把第一个未分组的学生分配到C组,这样他们和其他11个学生就有165种组合:
我们还有8个学生,其中7个可以用35种方式与第一个未分组的学生配对进入D组:
然后,一旦我们确定了其他组,就只剩下一组四个学生,其中三个可以与第一个未分组的学生配对:
这意味着有2546亿个组合:
下面是一个正在进行中的函数,它可以根据任意序列号生成分组。
1)[进行中]将序列号转换为一个向量,该向量描述应将哪个#组合用于组A、B、C、D和E。例如,这应将#1转换为
c(1, 1, 1, 1, 1)
,将#2,546,168,625转换为c(969, 455, 165, 35, 1)
。2)将组合转换为描述每个组中学生的特定输出。
2ic8powd4#
这里有一个小数字的例子。我不认为这将扩展到20名学生
由reprex package(v0.3.0)于2019年9月2日创建
可能路径的总数由以下函数(from here)给出
对于总共20人中的4人的组,可能的安排的数量是巨大的。
qij5mzcb5#
下面的代码可以工作。
pw9qyyiw6#
所以你可以用
expand.grid
函数得到所有的组合,只需要把数据向量加四次。然后结果会有c(1,1,1,1)
这样的组合,所以我删除了每一行有重复值的行,最后一部分只是进行组合。这是2个循环,非常慢,但它会得到你想要的。它可以用Rcpp
包加速。代码为:cuxqih217#
下面是一个只使用
base
R函数来生成可能的组组合的函数。下面是如何使用它的示例:
如果有更好的
base
R解决方案,我很乐意去看看。我相信有更有效的方法,因为这种方法生成所有可能的排列,然后去掉每个组中实际上没有不同东西的排列。cedebl8k8#
下面的代码给出了从20个中选择的4个的所有唯一组合,没有重复。