0

我想问一下,如果你们中的一些人不知道解决此类问题的任何简单方法:我需要生成从集合 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)。

4

3 回答 3

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
于 2012-04-26T19:50:03.583 回答
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
于 2012-04-26T19:58:46.700 回答
1

使用漂亮的partitions()包和更有趣的AB和值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
于 2012-04-26T20:05:14.977 回答