2012-04-26 52 views
0

我想問一下,如果你有些人不知道解決這類問題的簡單方法: 我需要生成從一組B中取出的所有數字的組合(0,1,2 ... B),並且它們的和= C.使用R生成向量

即,如果A=2B=3C=2

解在這種情況下:

(1,1);(0,2);(2,0) 

所以載體是長度2(A),其所有項目的總和爲2(C),可能的值爲每個矢量元素來自集合{0,1,2,3}(最大值是B)。

+0

對於B項以上的測試沒有意義。 – 2012-04-26 19:47:09

回答

1
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 
1

的功能版本,因爲我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 
1

使用漂亮partitions()包,和A更有趣的值,BC

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