2013-12-16 41 views
2

我正在嘗試創建一個矩陣,其中包含某個範圍內的所有數字組合,以便該行可以合計爲特定值。我不確定是否有這個功能,或者如果我需要手動創建功能。我已經嘗試過combn函數,但它不限制總和,所以矩陣變得非常快。在預算內創建一個包含所有組合的矩陣

例如:3行那筆5

5,0,0 
4,1,0 
4,0,1 
3,2,0 
3,0,2 
3,1,1 
2,3,0 
2,0,3 
2,2,1 
2,1,2 
etc.. 

回答

4

這些組合對象稱爲partitions(見here甚至here),以及它們的計算是由partitions實施包。

取決於你真正想要的,請使用下列之一:

library(partitions) 

## The first argument says you want to enumerate all partitions in which the 
## second argument (5) is broken into three summands, each of which can take a 
## maximum value of 5. 
blockparts(rep(5,3),5) ## Equiv: blockparts(c(5,5,5), 5) 
#            
# [1,] 5 4 3 2 1 0 4 3 2 1 0 3 2 1 0 2 1 0 1 0 0 
# [2,] 0 1 2 3 4 5 0 1 2 3 4 0 1 2 3 0 1 2 0 1 0 
# [3,] 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 3 3 3 4 4 5 

restrictedparts(5,3) 
#    
# [1,] 5 4 3 3 2 
# [2,] 0 1 2 1 2 
# [3,] 0 0 0 1 1 
+1

+1。我最初也在考慮分區軟件包,但我幾乎從不使用軟件包,所以仍然在閱讀文檔:-) – A5C1D2H2I1M1N2O1R2T1

+0

非常感謝您的洞察力。 – rrbest

3

這或許你想要做什麼:

x <- expand.grid(replicate(3, list(0:5))) 
x[rowSums(x) == 5, ] 
#  Var1 Var2 Var3 
# 6  5 0 0 
# 11  4 1 0 
# 16  3 2 0 
# 21  2 3 0 
# 26  1 4 0 
# 31  0 5 0 
# 41  4 0 1 
# 46  3 1 1 
# 51  2 2 1 
# 56  1 3 1 
# 61  0 4 1 
# 76  3 0 2 
# 81  2 1 2 
# 86  1 2 2 
# 91  0 3 2 
# 111 2 0 3 
# 116 1 1 3 
# 121 0 2 3 
# 146 1 0 4 
# 151 0 1 4 
# 181 0 0 5 

expand.gridcombn是有點關係,但我覺得expand.grid更適用於這些問題類型。


也有從「gtools」包permutations功能:

library(gtools) 
x <- permutations(6, 3, v = 0:5, set = FALSE, repeats.allowed=TRUE) 
x[rowSums(x) == 5, ] 
相關問題