如果总和被所有列的这个工作:
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)
应该发生什么,如果所需的款项是不可能的?对于VAR1,16是不可行的。如果多个ITER具有相同的值(例如VAR7的ITER_1和ITER_3),应该采用哪一个ITER? –
当我试图弄清楚问题的逻辑时,我会用铅笔和纸坐下来,尝试一些示例,并观察通过示例进行操作时所遵循的步骤。这些步骤通常会导致解决问题所必需的逻辑思想。也许这种方法适用于你。 – GreatBigBore
@亚历克斯:感谢您的评论。如果多个Iter具有相同的值,则代码将突出显示所有这些值。例如。如果有2个VAR1组合,它们有1个共同的iter(比如ITER_3),那么它会突出显示3个iter。但这种可能性可以忽略不计。另外,如果我们可以放置一个范围,则直接总和是可能的。但是这些有点柔化。如果我解决了这个简单的问题,那么我们可以在以后增加更多并发症。 – Beta