R-查找唯一值的排列组合

6
我希望创建一个包含两个不同值的向量的所有可能排列,我想控制每个值的比例。例如,如果我有一个长度为三的向量,我想要包含单个1的所有可能组合,我的期望输出是一个列表,看起来像这样:
list.1 <- list(c(1,0,0), c(0,1,0), c(0,0,1))

相反,如果我想要包含三个1的所有可能组合,我的期望输出是一个列表,看起来像这样:
list.3 <- list(c(1,1,1))

换句话说,10值的模式很重要,但所有的1应被视为与其他1相同。
根据在这里和其他地方搜索的结果,我尝试了几种方法:
expand.grid(0:1, 0:1, 0:1)  # this includes all possible combinations of 1, 2, or 3 ones
permn(c(0,1,1))             # this does not treat the ones as identical (e.g. it produces (0,1,1) twice)
unique(permn(c(0,1,1)))     # this does the job!

因此,使用来自包 combinat 的函数 permn 看起来很有前途。然而,当我将其扩展到我的实际问题(一个长度为20的向量,其中50%是1,50%是0)时,就会遇到问题:

unique(permn(c(rep(1,10), rep(0, 10))))

# returns the error:
Error in vector("list", gamma(n + 1)) : 
  vector size specified is too large

我的理解是,调用permn时会生成一个包含所有可能排列的列表,尽管其中许多是相同的,但该列表对于R来说太大了,因此会出现这种情况。

是否有人有解决方法?

如果以前已经回答过这个问题,请原谅我,因为有很多类似语言但不同问题的SO问题,我找不到符合我的需求的解决方案!


2
这个链接应该会有所帮助:https://dev59.com/a4fca4cB1Zd3GeqPlJ6W#28368933 - wici
2个回答

3

expand.grid 包含所有排列组合不应该成为一个阻碍。只需在其后添加子集即可:

combinations <- function(size, choose) {

  d <- do.call("expand.grid", rep(list(0:1), size))
  d[rowSums(d) == choose,]

}

combinations(size=10, choose=3)
#    Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10
# 8     1    1    1    0    0    0    0    0    0     0
# 12    1    1    0    1    0    0    0    0    0     0
# 14    1    0    1    1    0    0    0    0    0     0
# 15    0    1    1    1    0    0    0    0    0     0
# 20    1    1    0    0    1    0    0    0    0     0
# 22    1    0    1    0    1    0    0    0    0     0
...

2
问题确实在于您最初计算了所有的阶乘(20) (~10^18)个排列,这些排列无法全部存储在内存中。 您需要寻找一种高效的方法来计算多重集合排列。可以使用“multicool”软件包来完成此操作:
library(multicool)

res <- allPerm(initMC(c(rep(0,10),rep(1,10) )))

这个计算在我的笔记本电脑上大约需要两分钟,但绝对是可行的。


这不会产生所需的输出。你能发一下 head(res) 吗? - Pierre L
这个解决方案对我来说似乎有效;两者都产生了184,756个行总和为10的组合。然而,我选择了Pierre的解决方案,因为在我的电脑上运行时间小于1秒(而不是大约90秒)。 - Sam Zipper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接