条件选择变量

时间:2013-08-07 16:20:35

标签: r

假设我有以下表格:

     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.在这种情况下,我想选择VAR1ITER_2& ITER_4。对于VAR2ITER_3& ITER_4

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

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

谢谢。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

你应该研究递归算法

你可以找到一个很好的例子here