找到一组多项式组合

时间:2014-11-03 02:22:01

标签: r combinations multinomial

让我们说我有一个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行)向后工作

  3. 两者都不适合我。

    可以用

    获得置换矩阵
    library(gtools)
    dat=permutations(6, 6, set=TRUE, repeats.allowed=FALSE)
    

    我认为从完整的排列矩阵向后工作有点过分,但此时我还要做任何事情。

    是否有针对此预先构建的功能的包?任何人都有任何想法我会怎么做?

1 个答案:

答案 0 :(得分: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