0

假设我有下表:

     VAR    ITER_1  ITER_2  ITER_3  ITER_4
    VAR1    6       8       5       7
    VAR2    5       1       7       8
    VAR3    3       8       8       4
    VAR4    8       7       2       5
    VAR5    8       7       9       2
    VAR6    8       7       3       6
    VAR7    4       7       4       5

我想为每一行选择列的组合,以便组合等于特定的总和。例如,在这种情况下,假设我希望 ITER 的每个 VAR 组合为 15。在这种情况下,我想选择 for VAR1, ITER_2& ITER_4。对于VAR2, ITER_3& ITER_4.

我想开发一个代码,这样代码可以告诉我为每个 VAR 选择哪些列值。

有人可以提出一些方法吗?不需要编写代码,但我可以使用的逻辑。

谢谢你。

4

2 回答 2

2

如果对所有列取总和,则此方法有效:

data = data.frame(x = 1:3, y = 2:4, z = 5:7)
sums = apply(data, 1, sum)
target.val = 11
which(sums == target.val)

否则,这看起来像是一个精确的覆盖问题。 http://en.wikipedia.org/wiki/Exact_cover

或者

您可以使用随机方法,例如遗传算法。一个简单的解决方案:

find.colsums = function(data, target,  N.tries = 100)
{
  nrows = nrow(data)
  max.cols = ncol(data)
  n.columns = sample(max.cols, N.tries, replace = TRUE)

  for (i in 1:N.tries){
    test.cols = sample(max.cols, n.columns[i])

    for (row in 1:nrows){
      if (sum(data[row, test.cols]) == target){
        cat("match at row:", row, "cols:", test.cols, "\n")
      }
    }
  }
}

例子:

data = data.frame(x = 1:3, y = 2:4, z = 5:7)
target = 7
find.colsums(data, target)

大数据集的乐趣:

N = 1000
min.val = 1
max.val = 30
ncols = 10
target = ((min.val + max.val) * ncols/2)

data = matrix(sample(min.val:max.val, N, replace = TRUE), ncol = ncols)
find.colsums(data, target, N.tries = 1000)
于 2013-08-07T16:34:31.060 回答
0

你应该研究递归算法

你可以在这里找到一个很好的例子

于 2013-08-07T16:32:38.773 回答