R - 查找数据帧的哪个值以最小化总和

时间:2017-06-08 10:20:08

标签: r

在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相关联。

因此它促进了这个问题。

再次感谢你。

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