【问题标题】:Conditional selection of variables变量的条件选择
【发布时间】:2013-08-07 16:20:35
【问题描述】:

假设我有这个下表:

     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_2ITER_4。对于VAR2ITER_3ITER_4

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

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

谢谢。

【问题讨论】:

  • 如果无法获得所需的总和,应该怎么办?对于 VAR1,16 是不可行的。如果多个 ITER 具有相同的值(例如 VAR7 的 ITER_1 和 ITER_3),应该采用哪个 ITER?
  • 当我被困在试图找出问题的逻辑时,我会用铅笔和纸坐下来尝试一些示例,并在处理示例时观察我遵循的步骤。这些步骤通常会导致对解决问题所必需的逻辑的想法。也许这种方法对你有用。
  • @Alex:感谢您的评论。如果多个 Iter 具有相同的值,则代码将突出显示所有它们。例如。如果 VAR1 有 2 个组合具有 1 个公共迭代(比如 ITER_3),那么它将突出显示 3 个迭代。但这种可能性微乎其微。此外,如果我们可以设置一个范围,那么总和是可能的。但是这些 r 位的复杂性。如果我能解决简单的问题,那么我们以后可以添加更多的复杂性。
  • 感谢 GreatBigBore!我试试看。

标签: r


【解决方案1】:

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

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)

【讨论】:

  • 谢谢费尔南多!我会试试你的答案。
  • 再次感谢!我刚刚参与了其他工作,所以不能更早地访问该网站。
【解决方案2】:

你应该研究递归算法

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

【讨论】:

  • 感谢塞尔吉奥!我正在考虑您的建议。
猜你喜欢
  • 2013-10-08
  • 2021-01-23
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2020-10-01
  • 2014-12-13
  • 1970-01-01
相关资源
最近更新 更多