1

假设我有一个整数向量 1:6

w=1:6

我试图获得一个 90 行和 6 列的矩阵,其中包含来自这 6 个整数的多项组合,这些整数被视为 3 个大小为 2 的组。

6!/(2!*2!*2!)=90

因此,矩阵的第 1 列和第 2 列代表第 1 组,第 3 列和第 4 列代表第 2 组,第 5 列和第 6 列代表第 3 组。类似于:

1 2 3 4 5 6

1 2 3 5 4 6

1 2 3 6 4 5

1 2 4 5 3 6

1 2 4 6 3 5

...

最终,我想将其扩展到其他有限大小的多项式组合(因为数字变得相当快),但我无法让事情正常工作。我发现了几个执行二项式组合的函数(只有 2 个组),但是当组数大于 2 时,我找不到任何执行此操作的函数。

我尝试了两种方法:

  1. 使用 for 循环从无到有构建矩阵并尝试使用 reshape 包进行操作(认为使用 melt() 可能会有所帮助)

  2. 通过尝试保留组内的唯一行或删除组内的重复行,从排列矩阵(720 行)向后工作

都不适合我。

置换矩阵可以得到

library(gtools)
dat=permutations(6, 6, set=TRUE, repeats.allowed=FALSE)

我认为从完整的排列矩阵向后工作有点过分,但我现在正在尝试任何事情。

有没有为此预建功能的包?有人对我应该如何进行有任何想法吗?

4

1 回答 1

1

以下是如何实施“逆向工作”方法:

gps <- list(1:2, 3:4, 5:6)

get.col    <- function(x, j) x[, j]
is.ordered <- function(x) !colSums(diff(t(x)) < 0)
is.valid   <- Reduce(`&`, Map(is.ordered, Map(get.col, list(dat),  gps)))

dat <- dat[is.valid, ]

nrow(dat)
# [1] 90
于 2014-11-03T03:03:03.763 回答