组合:如果总和等于给定值,则选择排列

时间:2015-11-12 08:02:33

标签: r data.table

我有一个包含两列的data.table。目标是仅为每个“total_sum”保留行的组合,其中sum(a) == total_sum。因此,我们需要使用combn生成所有可能的组合,并再次测试它们total_sum。

我希望最大化我保留的行数,这样当有多个解决方案时我想保留一个具有最大元素数的解决方案。

如果两个具有相同数量元素的组合是可能的,那么我可以保留其中一个。

我实际上设法解决了这个问题(我想),但我的代码非常慢。我必须将它应用于大型数据集,因此必须有更好的方法来实现它。

set.seed(42)
dt1 = data.table(a = sample(1:5, 18, replace = TRUE), total_sum = sample(4:8, 3, replace = TRUE))
setkey(dt1, total_sum)
a total_sum
 1: 5         6
 2: 5         6
 3: 5         6
 4: 4         6
 5: 4         6
 6: 1         6
 7: 4         6
 8: 3         6
 9: 5         6
10: 2         6
11: 5         6
12: 5         6
13: 2         8
14: 3         8
15: 4         8
16: 4         8
17: 3         8
18: 1         8
myft <- function(a, total_sum) {
        len = length(a)
        for (i in len:1) {
            valid = match(a, combn(a, i)[, match(TRUE, combn(a, i, sum) == total_sum)], nomatch = FALSE) & TRUE
            if (any(valid)) {
                return (valid)
            }
        }
        return (rep(FALSE, len))
    }
    dt1[, .SD[myft(a, total_sum),], by = .(total_sum)]
   total_sum a
1:         6 1
2:         6 3
3:         6 2
4:         8 2
5:         8 3
6:         8 3

0 个答案:

没有答案