【问题标题】:How to generate all combinations of a vector [duplicate]如何生成向量的所有组合[重复]
【发布时间】:2012-08-24 00:41:22
【问题描述】:

假设我有 3 个绿色球、2 个橙色球和 8 个黄色球。我想订购它们,鉴于所有相同颜色的球都是相同的,我如何生成所有可能的序列。

在 R 中,使用gregmisc,我可以这样做

balls<-c('orange','orange', 'green', 'green','green','yellow'...'yellow')

然后就做吧

g <- permutations(length(balls),length(balls),v=balls,set=F)
g.reduced <- g[!duplicated(g),]

但这似乎非常不必要。

【问题讨论】:

  • 如果您的颜色向量是 v,则只需执行 g &lt;- unique(permutations(length(v),length(v),v,F))。单线。
  • 绝对更具可读性,但是,这仍然没有摆脱计算重复项的额外计算工作。随着长度(v)变得更大,这可能是不可行的。
  • 好吧,这个算法怎么样。为简单起见,我只假设一个重复的元素,但我认为概括它不会是一个问题。 unique 首先是一切,然后计算排列。你得到一个矩阵,其中包含其他元素的排列和以前不唯一的元素之一。将每一行展开为长度为 m + 1 + n - 1 的向量,其中 n 是先前非唯一元素的数量,m 是其他元素的数量。从末尾开始 m + 1 个元素,将第一个元素放在原始行中并遍历所有可能的元素
  • 原行中元素的间距,填充中间的n - 1其他元素。这个想法是置换矩阵给出了一个排序,你用你的n - 1重复元素填充潜在的空白。我将尝试对其进行编码或伪编码并将其放在答案中。
  • 这可能与这里的问题相同:Permute all unique enumerations of a vector in R: stackoverflow.com/q/5671149/210673

标签: r


【解决方案1】:

这是我能想到的最明显的方法。这是我从上面的 cmets 中获得的方法,但我从向量中删除了非唯一元素的所有条目,而不是除一个之外的所有条目。如果我留下一个,这种方法会导致每个条目都有一个重复。

arr  # one of the rows of the matrix of permutations
l  # the length of the original un-unique'd vector
out <- list()
vec <- vector(length=l)
find.placings <- function(start, pos, vec, m) {
    if (m == 0)
        return(vec)
    for (i in pos:(l - m + 1)) {
        vec[i] <- arr[start]
        out[[length(out) + 1]] <- find.placings(start + 1, i + 1, vec, m - 1)
    }
}

当然,因为这是高度递归的,所以要小心。我也没有测试过。如果要调用该函数,请将其原始值设置为(1, 1, vector(length=l), m)

【讨论】:

  • 我不明白如何使用这段代码;原帖中的 balls 对象的等价物是什么?
  • 再一次,假设balls 向量只有一个具有重复项的条目(对于更多重复条目,代码会更复杂),您删除这些条目,不留下任何内容。将原始向量的长度保存为“l”。然后在该新向量上调用permutations,获得矩阵m。在m 的每一行arr 上,您调用上面的代码,这将为您提供arr 元素的所有排序,中间有空格。用原始重复元素填充这些空格(很可能是NA)是一件简单的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2017-05-19
  • 2015-04-01
相关资源
最近更新 更多