この種の問題を解決する簡単な方法を知らない人がいる場合は、お尋ねしたいと思います: セット B (0,1,2...B) から取得した A 番号のすべての組み合わせを生成する必要があります。合計 = C.
つまりA=2
、B=3
、C=2
:
この場合の解決策:
(1,1);(0,2);(2,0)
したがって、ベクトルの長さは 2 (A)、そのすべての項目の合計は 2 (C) で、各ベクトル要素の可能な値はセット {0,1,2,3} から取得されます (最大値は B)。
気の利いた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
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
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