【问题标题】:How do I find the difference between the next minimum cost and the least minimum cost如何找到下一个最低成本和最低最低成本之间的差异
【发布时间】:2021-09-06 09:33:12
【问题描述】:

我有一个包含这种格式的表格的文件列表。表格尺寸可能不同。 我想在每行和每列中找到第二个最低成本和最低最低成本之间的差异。

在此示例中,我想将 ma​​x 替换为第二个最低成本。我不知道如何获得它。

data
r_data = nrow(data)
col_data = ncol(data)



cost = data[1:(r_data-1), 1:(col_data-1)]
## cost for the table
supply = data[1:(r_data-1),col_data]
demand = data[r_data, 1:(col_data-1)]

cost
supply
demand

## for the rows difference
min_dif_row <- apply(cost, 1, max) - apply(cost, 1, min)
min_dif_row

min_dif_row 的输出应该是 5 1 1 而不是 58 73 73。

非常感谢您的支持。

【问题讨论】:

  • (a) 你能分享一些复制/粘贴格式的样本数据吗? (b) 如果有联系,你希望发生什么?如果有 2 个最大值,它们都被替换了吗?如果有 2 个值与最小值相关联,那么差异是 0 吗?“第二个最小值”是否与第一个相同?
  • 对于最小差异,您可以尝试apply(cost, 1, function(x) abs(diff(x[rank(x) %in% c(1, 2)]))),但您可能应该为rank 设置一个ties.method 参数,并且可能需要根据您对我上面问题的回答进行调整.
  • ## [,1] [,2] [,3] [,4] [1,] 67 14 18 9 [2,] 76 3 21 4 [3,] 47 4 77 5 ##最小值为9,下一个最小值为14。如果平局,则使用第二个最小值,因此差值不能为0。
  • 能否请您与dput() 共享数据以便复制/粘贴? dput(data[1:5, 1:3]) 会很棒。
  • dput(data = matrix(c(67,14,18,9,38,76,3,21,4,20,47,4, 77,5,18,5, 24, 35,12, 76), ncol= 5, byrow = TRUE))

标签: r sorting optimization min


【解决方案1】:

这可能是您正在寻找的:

sec_min <- function(x) {
  xs <- sort(x)
  xs[which(diff(xs) > 0)[1] + 1]
}

min_dif_row <- apply(cost, MARGIN = 1, FUN = sec_min) - apply(cost, 1, min)

在对一行进行排序后说,你有类似的东西:3 3 4 5 7。该函数返回第二个最小值4

甚至更优雅:

sec_min <- function(x) {
  unique(sort(x))[[2]]
}
min_dif_row <- apply(cost, MARGIN = 1, FUN = sec_min) - apply(cost, 1, min)

【讨论】:

  • 非常感谢。有效。我不介意你能解释一下函数中的“which”。
  • which 返回满足特定条件的向量、数组或列表的索引。在这种情况下,条件是 2 个连续数字之间的差值应大于 0。
猜你喜欢
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2014-08-30
相关资源
最近更新 更多