我有一个包含两列的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