在R中,我有以下数据框:
Mean_1 Mean_2 Nb_element_1 Nb_element_2
42.66667 51.89474 3 38
65.00000 -85.87500 1 8
163.32653 -117.96970 49 33
22.83333 247.00000 6 1
我会解决以下优化问题:
(1):argmin Sum(| | Mean_1 | - | Mean_2 | | + | nb_element_1-nb_element_2 |)
(2):1.1 * | Mean_1 | > | Mean_2 | > 0.75 * | Mean_1 |
我想找到哪些元素给出受(2)
约束的最小和值是否有能够做到这一点的功能?像solve()我们必须解决(1)= 0或其他函数?
谢谢。
编辑:我想要的是在Mean_1和Mean_2之间得到最小和值的元素之间的最佳组合,例如:
(Mean_1[1],Nb_element_1[1]) with (Mean_2[3],Nb_element_2[3])
(Mean_1[2],Nb_element_1[2]) with (Mean_2[1],Nb_element_2[1])
(Mean_1[3],Nb_element_1[3]) with (Mean_2[4],Nb_element_2[4])
(Mean_1[4],Nb_element_1[4]) with (Mean_2[2],Nb_element_2[2])
给出最小的和值(不是在这种特殊情况下,它只是一个解释的例子)
实际上,Mean_1和Nb_element_1与Mean_2和Nb_element_2相关联。
因此它促进了这个问题。
再次感谢你。
答案 0 :(得分:1)
这样的事情会起作用吗?
df <- read.table(text="Mean_1 Mean_2 Nb_element_1 Nb_element_2
42.66667 51.89474 3 38
65.00000 -85.87500 1 8
163.32653 -117.96970 49 33
22.83333 247.00000 6 1",header=TRUE,sep="")
solve1 <- function(df){
coords <- expand.grid(1:nrow(df),1:nrow(df))
df <- cbind(df[coords[[1]],c(1,3)],df[coords[[2]],c(2,4)])
df <- transform(df,
sum_value = abs(abs(Mean_1) -abs(Mean_2)) + abs(Nb_element_1-Nb_element_2),
constraint_test = 1.1*abs(Mean_1) > abs(Mean_2) & abs(Mean_2) > 0.75*abs(Mean_1))
# head(df)
# Mean_1 Mean_2 Nb_element_1 Nb_element_2 sum_value constraint_test
# 1 42.66667 51.89474 3 38 44.22807 FALSE
# 2 65.00000 51.89474 3 38 48.10526 TRUE
# 3 163.32653 51.89474 3 38 146.43179 FALSE
# 4 22.83333 51.89474 3 38 64.06141 FALSE
# 1.1 42.66667 51.89474 1 38 46.22807 FALSE
# 2.1 65.00000 51.89474 1 38 50.10526 TRUE
result <- df[which(df$sum_value == min(subset(df,constraint_test)$sum_value)),]
}
r <- solve1(df)
# Mean_1 Mean_2 Nb_element_1 Nb_element_2 sum_value constraint_test
# 2.16 65 51.89474 1 1 13.10526 TRUE
答案 1 :(得分:0)
library(dyplr)
mydf <- read.table(text = "Mean_1 Mean_2 Nb_element_1 Nb_element_2
42.66667 51.89474 3 38
65.00000 -85.87500 1 8
163.32653 -117.96970 49 33
22.83333 247.00000 6 1", header=TRUE)
我将创建3个新的列名称&#34; ConcolX&#34; (对于&#34; Constraint Columns&#34;) - 必须给他们一些名字。
我认为您的原始数据框架没有合理的解决方案,所以在这里我尝试使用蛮力方法,对于所有4列,整数在0到200之间置换。您可以使用更准确的估算来优化搜索空间。
mydf3 <- expand.grid(seq(0,200,3), seq(0,200,4), seq(0,200,5), seq(0,200,4))
colnames(mydf3) <- c("Mean_1", "Mean_2", "Nb_element_1", "Nb_element_2")
mydf3 <- mydf3 %>%
mutate(Concol1 = abs(Mean_1) - abs(Mean_2) + abs(Nb_element_1) + abs(Nb_element_2)) %>%
mutate(Concol2 = 1.1 * abs(Mean_1) > abs(Mean_2)) %>%
mutate(Concol3 = abs(Mean_2) > 0.75 * abs(Mean_1)) %>%
filter(Concol2 == TRUE & Concol3 == TRUE) %>%
filter(Concol1 == min(Concol1))
结果:
mydf3
Mean_1 Mean_2 Nb_element_1 Nb_element_2 Concol1 Concol2 Concol3
1 171 188 0 0 -17 TRUE TRUE
2 183 200 0 0 -17 TRUE TRUE