2016-09-11 9 views
3

私は数学的な問題に悩まされています。私は整数 "n"が各グループ "k"が少なくとも1(k> = 1)であるように "k"グループに分けることができるすべての方法を出力する関数を作りたいと思います。私は出力としてデータフレームを希望kグループにまたがるn個の分割方法 - R

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

機能のようなものを見ることができます。そうするために: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 

ソリューションは、データフレームで提示される順序は重要ではありません。

hereのようなソリューションを探し、herehereなどの他の言語を探しました。残念ながら、私はこれに基づいて私の問題に合った機能を作るのは良いことではありませんが、うまくいけばあなたです。

ありがとうございます!

答えて

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 

関数組成()整数を分割すべての2 ^(N-1)の方法を返します。したがって、4 + 1 + 1は1 + 4 + 1または1 + 1 + 4とは異なります。

+0

ありがとうございました。クリーンで簡単。良いものをもう一度持って..ありがとう! – RobinvG

4

2つの可能性:その結果

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

'combn'は既にベースRに存在します.'コンビネーション 'は必要ありません。また、OPがこれを望んでいるかわからない。彼らが望む出力が与えられると、彼らはnに合計するkの整数を求めているように思えます。 – nicola

+0

速い応答のための@csgillespieに感謝しますが、あなたの出力を希望の出力と一致させることができません。 n_ways(5,3)(または別の関数)に対しては、6つの答えしかできません。 – RobinvG

+0

ありがとうございました。 – RobinvG

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 

あなたがに興味があるなら、私は関数にいくつかのコメントを書き込むことができますが、それはcolSumsまたはcombnとしてRベースの機能で構成されています。

+0

ありがとうございました。それはまさに私が尋ねたように動作し、私は実際に何が起こっているか見ることができます:)ありがとう、良い一日を! – RobinvG

関連する問題