首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dataframe内部优化

Dataframe内部优化
EN

Stack Overflow用户
提问于 2022-09-14 17:16:32
回答 1查看 38关注 0票数 0

我正试图在dataframe中找到一个优化解决方案。从三个单独的行中选择,我想找到一个将公式最小化的解决方案: result =(sum((B))+sum((C))/sum((A)

代码语言:javascript
复制
> set.seed(1)
> a <- sample.int(10,size = 10)
> b <- sample.int(10,size = 10)
> c <- sample.int(10,size = 10)
> df_optimize <- data.frame(a,b,c)
> df_optimize
    a  b  c
1   9  3  5
2   4  1  9
3   7  5  1
4   1  8  6
5   2  2 10
6   5  6  7
7   3 10  2
8  10  9  4
9   6  4  3
10  8  7  8
> 
> objective_function <- function(x,y,z) {
+   p_1 <- x$a + y$a + z$a
+   p_2 <- x$b + y$b + z$b
+   p_3 <- x$c + y$c + z$c
+   result <- (p_2 + p_3) / p_1
+   return(result)
+ }
> 
> #example result outputs
> objective_function(df_optimize[1,],df_optimize[3,],df_optimize[5,])
[1] 1.444444
> #and
> objective_function(df_optimize[2,],df_optimize[4,],df_optimize[6,])
[1] 3.7
> 
> # Attempt to find combination that minimizes result
> optimize(interval = df_optimize[1:10,], f = objective_function)
Error in x$a : $ operator is invalid for atomic vectors
EN

回答 1

Stack Overflow用户

发布于 2022-09-14 17:50:12

这是一个野蛮的力量,网格搜索解决方案。

代码语言:javascript
复制
inx <- 1:nrow(df_optimize)
arg_space <- expand.grid(inx, inx, inx)
i <- apply(arg_space, 1, \(x) any(x[1] == x[-1] | x[2] == x[3]))
arg_space <- arg_space[!i,]

res <- sapply(1:nrow(arg_space), \(i) {
  j1 <- arg_space[i, 1, drop = TRUE]
  j2 <- arg_space[i, 2, drop = TRUE]
  j3 <- arg_space[i, 3, drop = TRUE]
  objective_function(df_optimize[j1,],df_optimize[j2,],df_optimize[j3,])
})
i_opt <- which.min(res)

arg_space[i_opt, ]
#   Var1 Var2 Var3
#29    9    3    1

res[i_opt]
#[1] 0.9545455

编辑

在缩放到更多变量时,请确保列号都与

代码语言:javascript
复制
i <- apply(arg_space, 1, \(x) length(unique(x)) == length(x))
arg_space <- arg_space[i,]

注意,这提取条件id TRUE的位置,它使用的是i而不是!i

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73720837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档