1

我正在尝试创建向量的独特排列

 c(rep(0,20),rep(1,20))

但是组合包中的 permn 说“向量中的错误......指定的向量大小太大”。

我还尝试了这个问题中的脚本 uniqueperm2并再次得到“指定的向量太大”错误。

在我的理解 permn 将创建 40!排列。

我也许可以通过找到这个向量的唯一排列的数量来解决我正在研究的整体问题。

找到长度为 40 的向量的唯一排列的问题对 R 来说太大了吗?谁能向我解释如何计算列出向量的唯一排列的数量?

4

3 回答 3

2

该向量的每个唯一排列对应于来自 {1, 2, ..., 40} 的大小为 20 的子集(即 1 的索引)。

这些子集的数量是“40 选择 20”,即 40!/(20!x 20!)。根据谷歌计算器,这等于 137,846,528,820

于 2012-11-02T18:04:36.687 回答
1

正如您已经被告知的,排列的数量可以计算为:

R> choose(40,20)
[1] 137846528820

但是,R 当前可以处理的最长向量是 2^31 - 1 个元素长,即:

R> 2^31 - 1
[1] 2147483647

这比您要生成的排列数要小得多。因此,如果您使用标准函数尝试此操作以生成这些排列,则会出现您遇到的错误和错误combn()

R> combn(40, 20)
Error in matrix(r, nrow = len.r, ncol = count) : 
  invalid 'ncol' value (too large or NA)
In addition: Warning message:
In combn(40, 20) : NAs introduced by coercion

此时,您将不得不求助于编写代码以类似浴的方式生成排列并研究 R 上的许多大数据包之一(请参阅高性能计算任务视图)。

或者,这就是我的建议,考虑一下你可能会用 1370 亿美元做什么!(美式)排列然后采取另一种方法。如果您可以处理每秒 1 次(即对耗时 1 秒的排列做一些有意义的事情),您仍然可以在 4000 年的时间内研究结果!

那么为什么你想要所有的排列呢?较小的随机集就足够了吗?

于 2012-11-02T20:04:00.617 回答
0

有(40 个选择 20)独特的排列(即,在 s 的 40 个位置中选择 20 个,为0s 使用另外 20 个1。)这仍然是一个很大的数字,但是您可以尝试 combn(40, 20)

于 2012-11-02T18:04:09.313 回答