我陷入了数学问题。我想创建一个输出所有方式的函数" 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等解决方案,以及here和here等其他语言。不幸的是,基于此我做一个适合我的问题的函数并不是那么好,但希望你是。
提前多多感谢!
答案 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基函数colSums
或combn
。
答案 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。