0

我正在使用概率矩阵,如下所示:

       [,1]   [,2]   [,3]   [,4]   [,5]
[1,] 0.0002 0.3746 0.0165 0.0034 0.0274
[2,] 0.0142 0.0000 0.0005 0.0000 0.0000
[3,] 0.0000 0.0002 0.0000 0.0000 0.9847
[4,] 0.0052 0.0000 0.0000 0.0000 0.0001

我想得到每行中最高概率和第二高之间的比率,在这种情况下,它类似于:

13.67  # (0.3746 / 0.0274)
 28.4  # (0.0142 / 0.0005)
4923.5 # (0.9847 / 0.0002)
  52   # (0.0052 / 0.0001)

RowOrder帮助我识别第 1 列和第 2 列,但我无法进一步前进。也尝试使用类似的东西,apply(p_matrix, MARGIN= 1, FUN = order(decreasing = TRUE)[1:2] )但效果不大。

谢谢

4

1 回答 1

1
apply(mtx, 1, function(z) {
  z <- sort(z, decreasing = TRUE)[1:2]
  z[1] / z[2]
})
# [1]   13.67153   28.40000 4923.50000   52.00000

(仅供参考,您的第三个示例错误地将 0.9847 除以 0.002,每个数据应该是 0.0002。)

如果您有更多的数据,那么您可能会使用临时变量并除以一次来加速:

tmp <- apply(mtx, 1, sort, decreasing = TRUE)
tmp
#        [,1]   [,2]   [,3]   [,4]
# [1,] 0.3746 0.0142 0.9847 0.0052
# [2,] 0.0274 0.0005 0.0002 0.0001
# [3,] 0.0165 0.0000 0.0000 0.0000
# [4,] 0.0034 0.0000 0.0000 0.0000
# [5,] 0.0002 0.0000 0.0000 0.0000
tmp[1,] / tmp[2,]
# [1]   13.67153   28.40000 4923.50000   52.00000

(虽然我不确定它更快)。请注意,它apply(x, 1, ...)返回一个转置矩阵,因此我们将第一除以第二行。


数据

mtx <- structure(c(2e-04, 0.0142, 0, 0.0052, 0.3746, 0, 2e-04, 0, 0.0165, 5e-04, 0, 0, 0.0034, 0, 0, 0, 0.0274, 0, 0.9847, 1e-04), .Dim = 4:5)
于 2021-09-03T17:01:15.293 回答