gpt4 book ai didi

r - 使用 R 找到总和小于给定数字的所有可能的 3 个数字组合

转载 作者:行者123 更新时间:2023-12-04 12:18:21 26 4
gpt4 key购买 nike

我有以下一组数字 10、17、5、7、15。从这些数字中,我需要找到总和小于或等于 35 的所有可能的 3 个数字组合。在一个这样的组合中,特定数字不应包含超过一次。
例如: 10 ,10 ,5 是错误的组合,因为 10 重复了两次。

我试过这段代码,但它没有给出我需要的。

library(data.table)
df=expand.grid(x1=c(10,17,5,7,15),
x2=c(10,17,5,7,15),
x3=c(10,17,5,7,15)
)
setDT(df)
df[(x1+x2+x3) <= 35]

上面代码的一部分输出如下,
  x1 x2 x3
1: 10 10 10
2: 5 10 10
3: 7 10 10
4: 15 10 10
5: 5 17 10
6: 7 17 10
7: 10 5 10

根据上面的输出,可以观察到一个数字出现了不止一次。
任何人都可以提出提示以获得所需的结果吗?

谢谢你

最佳答案

尝试以下操作,看看这是否是问题所要求的。

x <- c(10,17,5,7,15)
i <- combn(x, 3, sum) <= 35

combn(x, 3)[, i]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,] 10 10 10 10 10 17 5
#[2,] 17 17 5 5 7 5 7
#[3,] 5 7 7 15 15 7 15

以上是大体思路。在内存和速度方面更有效的实现是 f2以下。
f1 <- function(x, n = 3, thres = 35){
i <- combn(x, n, sum) <= thres
combn(x, n)[, i]
}
f2 <- function(x, n = 3, thres = 35){
cmb <- combn(x, n)
cmb[, colSums(cmb) <= thres]
}

检查结果是否都具有不同的数字。
res <- f2(x)
apply(res, 2, function(y){
all(y[-1] != y[1])
})
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE

identical(f1(x), f2(x))
#[1] TRUE

现在计时功能。
microbenchmark::microbenchmark(f1 = f1(x), 
f2 = f2(x))
#Unit: microseconds
# expr min lq mean median uq max neval cld
# f1 105.150 107.383 110.66616 108.6535 109.896 238.899 100 b
# f2 62.779 65.568 67.65754 66.4290 67.145 122.119 100 a

关于r - 使用 R 找到总和小于给定数字的所有可能的 3 个数字组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57442572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com