我正在嘗試創建一個矩陣,其中包含某個範圍內的所有數字組合,以便該行可以合計爲特定值。我不確定是否有這個功能,或者如果我需要手動創建功能。我已經嘗試過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..
我正在嘗試創建一個矩陣,其中包含某個範圍內的所有數字組合,以便該行可以合計爲特定值。我不確定是否有這個功能,或者如果我需要手動創建功能。我已經嘗試過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..
這些組合對象稱爲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
這或許你想要做什麼:
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.grid
和combn
是有點關係,但我覺得expand.grid
更適用於這些問題類型。
也有從「gtools」包permutations
功能:
library(gtools)
x <- permutations(6, 3, v = 0:5, set = FALSE, repeats.allowed=TRUE)
x[rowSums(x) == 5, ]
+1。我最初也在考慮分區軟件包,但我幾乎從不使用軟件包,所以仍然在閱讀文檔:-) – A5C1D2H2I1M1N2O1R2T1
非常感謝您的洞察力。 – rrbest