假设我有以下表格:
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.在这种情况下,我想选择VAR1
,ITER_2
& ITER_4
。对于VAR2
,ITER_3
& ITER_4
。
我想开发一个代码,以便代码可以告诉我为每个VAR选择哪些列值。
任何人都可以提出一些方法吗?一个不需要编写代码,但我可以使用的逻辑。
谢谢。
答案 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