我想問一下,如果你有些人不知道解決這類問題的簡單方法: 我需要生成從一組B中取出的所有數字的組合(0,1,2 ... B),並且它們的和= C.使用R生成向量
即,如果A=2
,B=3
,C=2
:
解在這種情況下:
(1,1);(0,2);(2,0)
所以載體是長度2(A),其所有項目的總和爲2(C),可能的值爲每個矢量元素來自集合{0,1,2,3}(最大值是B)。
我想問一下,如果你有些人不知道解決這類問題的簡單方法: 我需要生成從一組B中取出的所有數字的組合(0,1,2 ... B),並且它們的和= C.使用R生成向量
即,如果A=2
,B=3
,C=2
:
解在這種情況下:
(1,1);(0,2);(2,0)
所以載體是長度2(A),其所有項目的總和爲2(C),可能的值爲每個矢量元素來自集合{0,1,2,3}(最大值是B)。
z <- expand.grid(0:3,0:3)
z[rowSums(z)==2, ]
Var1 Var2
3 2 0
5 1 1
7 0 2
如果你想做的擴大電網編程這會工作:
z <- expand.grid(rep(list(C), A))
您需要展開的列表中,這樣的項目仍然是獨立的。 rep(0:3, 3)
不會返回3個獨立的序列。因此,對於A = 3:
> z <- expand.grid(rep(list(0:3), 3))
> z[rowSums(z)==2, ]
Var1 Var2 Var3
3 2 0 0
6 1 1 0
9 0 2 0
18 1 0 1
21 0 1 1
33 0 0 2
的功能版本,因爲我SO更新前已經開始:
A=2
B=3
C=2
myfun <- function(a=A, b=B, c=C) {
out <- do.call(expand.grid, lapply(1:a, function(x) 0:b))
return(out[rowSums(out)==c,])
}
> out[rowSums(out)==c,]
Var1 Var2
3 2 0
6 1 1
9 0 2
使用漂亮partitions()
包,和A
更有趣的值,B
和C
:
library(partitions)
A <- 2
B <- 5
C <- 7
comps <- t(compositions(C, A))
ii <- apply(comps, 1, FUN=function(X) all(X %in% 0:B))
comps[ii, ]
# [,1] [,2]
# [1,] 5 2
# [2,] 4 3
# [3,] 3 4
# [4,] 2 5
對於B項以上的測試沒有意義。 – 2012-04-26 19:47:09