所有可能的方法将n分为k组 - R.

时间:2016-09-11 10:15:08

标签: r math combinations

我陷入了数学问题。我想创建一个输出所有方式的函数" n"可分为" k"以这样一种方式分组,即在每一组中" k"至少为1(k> = 1)。

该功能可能类似于:

n_ways <- function(n,k) {...}

我想将dataFrame作为输出。因此: n_ways(5,3)

     A  B  C
1    3  1  1
2    1  3  1
3    1  1  3
4    2  2  1
5    2  1  2
6    1  2  2

解决方案在dataFrame中的显示顺序并不重要。

我查找了here等解决方案,以及herehere等其他语言。不幸的是,基于此我做一个适合我的问题的函数并不是那么好,但希望你是。

提前多多感谢!

3 个答案:

答案 0 :(得分:4)

两种可能性:

eg <- expand.grid(rep(list(1:5), 3))
unique(eg[which(rowSums(eg)==5),])

导致:

   Var1 Var2 Var3
3     3    1    1
7     2    2    1
11    1    3    1
27    2    1    2
31    1    2    2
51    1    1    3

或者使用combinat(但此样本无需替换)

library(combinat)
combn(5, 3)
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    1    1    1    1    1    2    2    2     3
# [2,]    2    2    2    3    3    4    3    3    4     4
# [3,]    3    4    5    4    5    5    4    5    5     5

答案 1 :(得分:4)

这是我的解决方案, 它不是很快,但它可能是你提高速度的起点。

n_ways <- function(n, k){

    addend <- rep(seq(1,n),k)

    combinations <- combn(x = addend, m = k)

    combinations <- t(combinations[,which(colSums(combinations) == n)])

    return(unique(combinations))
}

n_ways(5,3)

#     [,1] [,2] [,3]
#[1,]    1    2    2
#[2,]    1    3    1
#[3,]    1    1    3
#[4,]    2    1    2
#[5,]    2    2    1
#[6,]    3    1    1

如果您感兴趣,我可以给函数写一些注释,但它包含R基函数colSumscombn

答案 2 :(得分:4)

您可以使用partitions包:

library(partitions)
t(compositions(5,3,FALSE))
#[1,] 3 1 1
#[2,] 2 2 1
#[3,] 1 3 1
#[4,] 2 1 2
#[5,] 1 2 2
#[6,] 1 1 3

从相应的帮助文件

  

函数composition()返回分区整数的所有2 ^(n-1)种方法;因此4 + 1 + 1不同于1 + 4 + 1或1 + 1 + 4。