R-查找值的唯一排列

Posted

技术标签:

【中文标题】R-查找值的唯一排列【英文标题】:R- Find Unique Permutations of Values 【发布时间】:2016-11-23 20:49:14 【问题描述】:

我希望创建包含两个不同值的向量的所有可能排列,其中我控制每个值的比例。

例如,如果我有一个长度为 3 的向量,并且我希望所有可能的组合都包含一个 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 值的模式很重要,但所有 1s 都应被视为与所有其他 1s 相同。

基于在这里和其他地方的搜索,我尝试了几种方法:

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 问题包含相似的语言但不同的问题,我无法找到满足我需求的解决方案!

【问题讨论】:

This 应该有帮助 【参考方案1】:

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)吗? 这个解决方案似乎对我有用;两者都产生了 184,756 个组合,rowsums==10。但是,我选择了 Pierre 的解决方案,因为它在

以上是关于R-查找值的唯一排列的主要内容,如果未能解决你的问题,请参考以下文章

并行/组合多个 64 位值的按位排列

递归之排列问题

全排列的实现

全排列问题的递归算法(Perm)

集合的全排列问题(递归实现)

查找所有排列以获得给定的总和(硬币找零问题)